День добрый!Как правильно будет выглядеть запрос с бинд переменной в операторе like?
Что-то наподобие "select * from ocip where upper(fio) like '%'||upper(rtrim(:word))||'%'", но результат всегда - все строки таблицы.
Спасибо.
>День добрый!
>
>Как правильно будет выглядеть запрос с бинд переменной в операторе like?
>
>Что-то наподобие "select * from ocip where upper(fio) like '%'||upper(rtrim(:word))||'%'", но результат
>всегда - все строки таблицы.
например
OCIBindByName(
oci_req_handle,&field_handle,error_handle,
":word",strlen(":word"),
(dvoid *)(&word_var),sizeof(word_var),
SQLT_STRING /* ?? не знаю точно ли такая константа */,
&i /* sb2 i=1 */,
&a /* ub2 a=field_size */,
&rcode,
0,0,OCI_DEFAULT);а в чем собсно разница - like, =, или еще какой оператор?
\^P^/
Бинжу =) я так:
char search[100];c1.bind_name ( ":word", search, 100 );
void cursor::bind_name(const char *name, char *value, int size)
{
OCIBind *tmp_bind;
sb2 *tmp_indp = new sb2;rc = OCIBindByName(_stmthp, &tmp_bind, _errhp, (text*)name, strlen(name), (dvoid*)value, size, SQLT_CHR, tmp_indp, 0, 0, 0, 0, OCI_DEFAULT);
if (rc)
{
throw oexcept("cursor::bind_name()", _errhp, rc);
}
_binds.push_back(tmp_bind);
_ind_names.push_back(tmp_indp);
}
Поведедение на разных ОС разное.
В виндеselect * from ocip where upper(fio) like '%'||upper(rtrim(:word))||'%'
возвращает все строки, в SunOS 5.9 ничего.В винде
select :word from dualничего не возвращает, в соляре то, что передашь. То бишь правильно работает.Если запрос без биндов, то есть
select * from ocip where upper(fio) like '%'||upper(rtrim('utusov'))||'%', то правльно работает и в винде и в солярке.Наверное, я неправильно бинжу.
> rc = OCIBindByName(_stmthp, &tmp_bind, _errhp, (text*)name, strlen(name), (dvoid*)value, size, SQLT_CHR, tmp_indp, 0, 0, 0, 0, OCI_DEFAULT);>Поведедение на разных ОС разное.
>В виндеselect * from ocip where upper(fio) like '%'||upper(rtrim(:word))||'%'
>возвращает все строки, в SunOS 5.9 ничего.
>
>В виндеselect :word from dualничего не возвращает, в соляре то,
>что передашь. То бишь правильно работает.
>
>Если запрос без биндов, то естьselect * from ocip where upper(fio)
>like '%'||upper(rtrim('utusov'))||'%', то правльно работает и в винде и в солярке.
>
>
>Наверное, я неправильно бинжу.
наверное. после индикатора - два нуля. ну rcode, возможно, и не обязательно, я не помню. но вот field size всеж надо передать (параметр, следующий сразу за индикатором - адрес переменной типа ub2, проинициализированый длинной поля в базе. у тебя там 0)кроме того, я OCI щупал только на соляре. за винды не скажу ничего...
\^P^/
кстати... а инициализируешь ли ты индикатор единицей прежде, чем екзек'ютить запрос?\^P^/
Индикатор действительно подводил.
И следующий аргумент так же =)
Думал, alenp для массивов только.
perece, спасибо!