我在INFORMIX DB中执行某些存储过程/函数时遇到问题。我尝试了不同的客户端,他们都是一样的 - 没有人检测到执行错误,而不是这个 - 返回空响应。这对我不起作用。
最后,我发现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
。
摘要 - 对错误程序的所有调用都很好 - 返回错误。但如果此错误存储在功能中 - 则未检测到错误;而不是这个 - 返回EMPTY字符串。 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
)。
无论如何,真正的解决方案不在这里。我已将其发布在相关问题中,对于特定案例更为具体和孤立:The same error is detected in stored **procedure**, but not in stored **function**
答案 0 :(得分:2)
Perl中的所有RaiseError都表示当DBD(如DBD :: ODBC)看到错误时,DBI将调用任何已注册的错误处理程序并使用该错误调用die(取决于错误处理程序返回的内容)。仍然由DBD通过set_err方法向DBI发出错误信号。
我认为你的Perl正在使用DBD :: ODBC。 DBD :: ODBC只会检查它调用的每个ODBC API的返回状态,如果它是SQL_SUCCESS_WITH_INFO,它会调用DBIs set_err说它是一个警告,如果是!SQL_SUCCEEDED它调用set_err说有错误(有一些例外,比如SQL_NO_DATA并不总是错误。)
如果你说你的Perl因为你期望的错误而死,但是你的C代码没有,那么你不能检查ODBC API返回,或者也许(因为你提到过程)你不能确保你在一个循环中调用SQLMoreResults在SQLExecute之后对SQL调用该过程。请记住,一些数据库一次执行一个过程中的每个插入/选择/更新,在ODBC中,您需要调用SQLMoreResults来遍历每个数据库。如果你不这样做,你的程序还没有完成,因此你可能没有遇到错误。