与unixODBC C API等效的RaiseError(PERL,DBI)?

时间:2011-07-13 12:58:06

标签: c perl dbi unixodbc

我在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;

isqlODBC 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**

1 个答案:

答案 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来遍历每个数据库。如果你不这样做,你的程序还没有完成,因此你可能没有遇到错误。