The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"like в запросе через OCI"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"like в запросе через OCI"  
Сообщение от dronord (ok) on 26-Апр-07, 18:01 
День добрый!

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

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

Спасибо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "like в запросе через OCI"  
Сообщение от perece on 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^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "like в запросе через OCI"  
Сообщение от dronord (ok) on 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'))||'%'
, то правльно работает и в винде и в солярке.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "like в запросе через OCI"  
Сообщение от perece on 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^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "like в запросе через OCI"  
Сообщение от dronord (ok) on 27-Апр-07, 14:17 
Индикатор действительно подводил.
И следующий аргумент так же =)
Думал, alenp для массивов только.
perece, спасибо!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру