The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
like в запросе через OCI, !*! dronord, 26-Апр-07, 18:01  [смотреть все]
День добрый!

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

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

Спасибо.

  • like в запросе через OCI, !*! perece, 21:31 , 26-Апр-07 (1)
    >День добрый!
    >
    >Как правильно будет выглядеть запрос с бинд переменной в операторе 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, 09:58 , 27-Апр-07 (2)
      Бинжу =) я так:

      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, 12:03 , 27-Апр-07 (3)
        > 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, 12:18 , 27-Апр-07 (4)
        кстати... а инициализируешь ли ты индикатор единицей прежде, чем екзек'ютить запрос?

        \^P^/




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

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