У меня проблема с выполнением некоторых хранимых процедур/функций в INFORMIX DB. Пробовал с разными клиентами и все одинаково - ни один не выявляет ошибок при выполнении, вместо этого - возвращают пустые ответы. И это не работает для меня.
Наконец, я обнаружил, что PERL DBI
имеет возможность установить RaiseError
, что-то вроде:
{ PrintError => 0, RaiseError => 1 }
И это работает идеально. А есть ли аналог (к сожалению, ничего не нашел) для библиотеки unixODBC C API
?
Кроме того: я попробовал тот же запрос с isql
, и это то же самое! Никаких ошибок, просто пустой результат :\ Может быть, это какая-то опция, которую нужно настроить (в odbc.ini
, я думаю..)?
РЕДАКТИРОВАНИЕ: Хорошо, вот еще некоторые подробности:
Версия: unixODBC 2.3.0
CREATE FUNCTION "test".NOK_func_k() RETURNING LVARCHAR(1000);
set debug file to '/home/directory_does_not_exists/unknown.log';
trace off;
trace on;
trace off;
return 'result is set here';
END FUNCTION;
CREATE PROCEDURE "test".NOK_proc_k(pDummy SMALLINT)
set debug file to '/home/directory_does_not_exists/unknown.log';
trace off;
trace on;
LET pDummy = 2;
trace off;
END PROCEDURE;
И результаты от isql
и ODBC C API
одинаковы. Вот дополнительная информация о C API
:
Executing: execute procedure NOK_proc_k(1)
retcode = SQL_ERROR SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: execute function NOK_func_k()
retcode = SQL_SUCCESS SQL_SUCCEEDED( retcode ) = 1
--------------------------------------------------
--------------------------------------------------
Executing: execute function NOK_proc_k(1)
retcode = SQL_ERROR SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: execute procedure NOK_func_k()
retcode = SQL_SUCCESS SQL_SUCCEEDED( retcode ) = 1
--------------------------------------------------
--------------------------------------------------
Executing: call NOK_proc_k(1)
retcode = SQL_ERROR SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: call NOK_func_k()
retcode = SQL_SUCCESS SQL_SUCCEEDED( retcode ) = 1
Все вызовы SQLMoreResults
возвращают SQL_NO_DATA
, все SQLFetch
возвращают SQL_ERROR
.
Резюме - все вызовы неправильных процедур в порядке - возвращается ошибка. Но если эта ошибка находится в сохраненной функции - ошибка не обнаруживается; вместо этого - возвращается ПУСТАЯ строка. Уч!
SQL_SUCCESS_WITH_INFO
нигде не возвращается. И так со многими другими ошибками (не со всеми, конечно, это просто пример)
И даже больше! Процедура или функция, например:
CREATE PROCEDURE "test".nok_proc_k_2() RETURNING LVARCHAR(1000);
DEFINE vNotDefined VARCHAR(10);
LET vNotDefined = current;
END PROCEDURE;
Не возвращает никакой ошибки, в то время как студия Aqua DB возвращает
Converted value does not fit into the allotted space
ОТВЕЧАТЬ:
Я приму ответ Бохики, так как он правильный и правильно отвечает на часть PERL DBI
. Также он мне очень помог (попадание с strace
).
В любом случае, настоящего решения здесь нет. Я разместил его в соответствующем вопросе, который является более конкретным и изолированным в конкретном случае: Та же ошибка обнаружена в сохраненной **процедуре**, но не в сохраненной **функции**
NOK_func_k
иNOK_proc_k
. Одно из них - процедура, другое - функция. Я написал, как они создаются. Кроме того, я разместил, как они выполняются:Executing: ....
+ результаты. Я не понимаю, какую еще информацию я должен опубликовать.NOK_proc_k
- это процедура с ошибкой внутри. И ошибка обнаружена, поэтому я не ожидаю, что она что-то вернет. Как вы меня процитировали - если эта ошибка в сохраненной функции - возвращается ПУСТАЯ строка - видите, я говорю о ФУНКЦИИ, то есть я имею в видуnok_func_k
. - person Kiril Kirov   schedule 27.07.2011nok_func_k
, и это функция, а не процедура. Но у нее такое же тело, как и у процедуры (NOK_proc_k
), просто она объявлена как функция и возвращает строку. Обратите внимание, какNOK_func_k
имеет возврат e в конце:return 'result is set here';
. А так как ошибка не обнаружена,SQLExecute
возвращаетSQL_SUCCESS
, а возвращаемая строка НЕ "result is set here"
, а""
. Какую часть я не объясню, хорошо..? :\ - person Kiril Kirov   schedule 27.07.2011call NOK_func_k()
изAqua Data Studio
и то же самое изPERL DBI
, выявляется ошибка:Cannot open DEBUG file for SPL routine trace.
.. - person Kiril Kirov   schedule 27.07.2011/tmp/
:\ - person Kiril Kirov   schedule 28.07.2011strace
, давно пора научиться им пользоваться :) - person Kiril Kirov   schedule 29.07.2011