URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6417
[ Назад ]

Исходное сообщение
"like в запросе через OCI"

Отправлено dronord , 26-Апр-07 18:01 
День добрый!

Как правильно будет выглядеть запрос с бинд переменной в операторе like?

Что-то наподобие "select * from ocip where upper(fio) like '%'||upper(rtrim(:word))||'%'", но результат всегда - все строки таблицы.

Спасибо.


Содержание

Сообщения в этом обсуждении
"like в запросе через OCI"
Отправлено perece , 26-Апр-07 21:31 
>День добрый!
>
>Как правильно будет выглядеть запрос с бинд переменной в операторе 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^/


"like в запросе через OCI"
Отправлено dronord , 27-Апр-07 09:58 
Бинжу =) я так:

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'))||'%'
, то правльно работает и в винде и в солярке.

Наверное, я неправильно бинжу.


"like в запросе через OCI"
Отправлено perece , 27-Апр-07 12:03 
> 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^/


"like в запросе через OCI"
Отправлено perece , 27-Апр-07 12:18 
кстати... а инициализируешь ли ты индикатор единицей прежде, чем екзек'ютить запрос?

\^P^/


"like в запросе через OCI"
Отправлено dronord , 27-Апр-07 14:17 
Индикатор действительно подводил.
И следующий аргумент так же =)
Думал, alenp для массивов только.
perece, спасибо!