LINUX.ORG.RU
ФорумAdmin

openldap, oracle


0

1

Задача усложнилась, надо подружить openldap и oracle. С постгресом все работает, а с ораклом выдает странную ошибку - SQL_NO_DATA (видно из файла трассировки unixODBC). В качестве драйвера ODBC используется стандартный libsqora.so.11.1.

Странно, что если в конфиге убрать из запроса параметр, то он отрабатывает (при этом openldap работает не правильно) Текст запроса: «SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return,sel_expr_u FROM ldap_attr_mappings where oc_map_id=?»

вот фрагмент трейса ODBC:

[ODBC][22466][1316178040.696639][SQLBindParameter.c][393] Exit:[SQL_SUCCESS]

[ODBC][22466][1316178040.696706][SQLExecute.c][183] Entry: Statement = 0x1bcc000

[ODBC][22466][1316178040.696747][SQLExecute.c][344] Exit:[SQL_ERROR]

[ODBC][22466][1316178040.696826][SQLError.c][348] Entry: Statement = 0x1bcc000 SQLState = 0x7ffff6854b10 Native = 0x7ffff6854b18 Message Text = 0x7ffff6854910 Buffer Length = 511 Text Len Ptr = 0x7ffff6854b1e

[ODBC][22466][1316178040.696846][SQLError.c][385] Exit:[SQL_NO_DATA]

В документации сказано, что ошибка SQL_NO_DATA выдается только на update или delete, но никак не на select.

Куда копать? Это ошибка драйвера? Есть ли альтернативные версии ODBC-драйвера для Oracle?

Спасибо!

Подключись sqlplus'ом и вручную прогони этот запрос. Может, синтаксис чуть отличается

router ★★★★★ ()
Ответ на: комментарий от router

подключался через isql, это запрос выполняется, данные возвращаются (4 записи). Также, предыдущий запрос openldap отработал нормально. Отличие бажного в том, что он имеет параметр. При исключении параметра все выполнятеся.

Поэтому я думаю - это либо косяк в unixODBC (но Postgres то работает), либо в клиентской библиотеке Oracle, поэтому хотел попробовать альтернативный драйвер.

kirichenkoga ()
Ответ на: комментарий от kirichenkoga

>Отличие бажного в том, что он имеет параметр. При исключении параметра все выполнятеся.
Какой?

Поэтому я думаю - это либо косяк в unixODBC (но Postgres то работает)

ODBC через библиотеки транслирует, то, что работает с одной базой - не говорит о том, что будет работать с другой.

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Если из запроса:

«SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_retu rn,sel_expr_u FROM ldap_attr_mappings where oc_map_id=?»

убрать bind-параметр ("?"), то есть сделать вот так: «SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_retu rn,sel_expr_u FROM ldap_attr_mappings where oc_map_id=2»

(именно значение 2 передаётся, судя по файлу трассировки), то slapd стартует, но работает не корректно.

ODBC может где-то не так транслировать, что съедатеся например postgres-ом но не oracl-ом.

Но большее подозрение все-таки на Oracle.

EasySoft-драйвер у меня не взлетел, поэтому с ним попробовать не получилось, к тому же он коммерческий. Есть ли алтернативные драйверы для Oracle?

kirichenkoga ()
Ответ на: комментарий от kirichenkoga

>(именно значение 2 передаётся, судя по файлу трассировки)
Сдается мне, что передается не 2... но, предположим, что это ничем не обоснованные фантазии.

ODBC может где-то не так транслировать

ODBC с одной стороны использует ODBC интерфейс, а с другой - интерфейс для той или иной БД.

Так вот, вы уверены, что у вас правильный (той версии) ODBC драйвер?

http://www.orafaq.com/wiki/ODBC_FAQ#Where_can_one_get_ODBC_drivers_for_Oracle...

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Вроде как разобрался. Если в SQLBindParameter использовать тип BACKSQL_C_NUMID (он же SQL_C_UBIGINT) то с ораклом происходит ошибка. Пробовал менять остальные параметры - все равно не работает. В тоже время, с postgres-ом все нормально. Заменил в исходнике openldap-а на SQL_C_ULONG - все заработало.

Возможно проблема в драйвере оракла на 64-битных системах, но детально разбираться времени нет сейчас.

kirichenkoga ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.