0

我在 INFORMIX DB 中执行一些存储过程/函数时遇到问题。我尝试了不同的客户端,它们都是相同的——没有人在执行时检测到错误,而不是这个——返回空响应。这对我不起作用。

最后,我发现可以PERL DBI选择 set 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 字符串。出局!

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)。

无论如何,真正的解决方案不在这里。我已将其发布在相关问题中,该问题对特定情况更为具体和孤立:在存储的**过程**中检测到相同的错误,但在存储的**函数**中未检测到

4

1 回答 1

2

Perl 中的 RaiseError 所做的只是说,当 DBD(如 DBD::ODBC)看到错误时,DBI 将调用任何已注册的错误处理程序并使用该错误调用 die(取决于错误处理程序返回的内容)。仍然由 DBD 通过 set_err 方法向 DBI 发出错误信号。

我认为您的 Perl 使用的是 DBD::ODBC。DBD::ODBC 将简单地检查它调用的每个 ODBC API 的返回状态,如果它是 SQL_SUCCESS_WITH_INFO 它调用 DBI set_err 说这是一个警告,如果是 !SQL_SUCCEEDED 它调用 set_err 说有一个错误(有一些例外,如SQL_NO_DATA 并不总是错误)。

如果您说您的 Perl 因您期望的错误而死,但您的 C 代码没有,那么您不能检查 ODBC API 返回,或者(因为您提到过程)您不能确保在 SQLExecute 之后在循环中调用 SQLMoreResults调用过程的 SQL。请记住,某些数据库一次在一个过程中执行每个插入/选择/更新,而在 ODBC 中,您需要调用 SQLMoreResults 来遍历每个过程。如果您不这样做,您的程序尚未完成,因此您可能没有遇到错误。

于 2011-07-13T13:38:51.187 回答