У меня проблема с выполнением некоторых хранимых процедур / функций в БД INFORMIX. Я пробовал с разными клиентами, и все они были одинаковыми - никто не обнаруживает ошибок при выполнении, вместо этого - возвращает пустые ответы. И это не работает для меня.
Наконец, я обнаружил, что PERL DBI
имеет возможность установить RaiseError
, что-то вроде:
{ PrintError => 0, RaiseError => 1 }
И это прекрасно работает. Но есть ли такой эквивалент (к сожалению, я ничего не нашел) для unixODBC C API
lib?
Кроме того: я попробовал тот же запрос с 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
.
Сводка - все вызовы неправильных процедур в порядке - возвращается ошибка. Но если эта ошибка находится в сохраненной функции - ошибка не обнаружена; вместо этого - пустая строка возвращается. Outch!
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
ОТВЕТ:
Я приму ответ bohica, так как он правильный и правильно отвечает по части PERL DBI
. Кроме того, он действительно помог мне (хит с strace
).
В любом случае, настоящего решения здесь нет. Я разместил его в соответствующем вопросе, который является более конкретным и изолированным для конкретного случая: Та же ошибка обнаружена в хранимой ** процедуре **, но не в хранимой ** функции **