Oracle SQL查询仅在一个进程中失败:“ORA-01405:获取的列值为NULL”

时间:2011-10-11 16:19:07

标签: sql oracle stored-procedures odp.net advanced-queuing

我正在尝试在我构建的“插件”中调用系统存储过程。当我在测试应用程序中测试我的插件时,它工作正常。当我在目标应用程序中运行插件时,我正在构建它,我从Oracle获得了一个没有任何意义的例外。

我正在使用Oracle服务器11.2.0.1.0和ODP.NET 2.112.2.0。

以下是来自我的测试应用程序的ODP.NET的调试跟踪:

(ENTRY) OracleConnection::OracleConnection(1)
(POOL)  New connection pool created for: "Data Source=orcl;User ID=scott;"
(ENTRY) OracleConnection::CreateCommand()
OpsSqlPrepare2():SQL: begin DBMS_AQADM.START_QUEUE(queue_name => 'MyQueue'); end;
(EXIT)  OpsSqlExecuteNonQuery(): RetCode=0 Line=877
(EXIT)  OracleCommand::ExecuteNonQuery()
(ENTRY) OracleConnection::Dispose()
(ENTRY) OracleConnection::Close()

这是来自ODP.NET的调试跟踪,来自目标应用程序中运行的相同代码:

(ENTRY) OracleConnection::OracleConnection(1)
(POOL)  New connection pool created for: "Data Source=orcl;User ID=scott;"
(ENTRY) OracleConnection::CreateCommand()
OpsSqlPrepare2():SQL: begin DBMS_AQADM.START_QUEUE(queue_name => 'MyQueue'); end;
(EXIT)  OpsSqlExecuteNonQuery(): RetCode=0 Line=877
(EXIT)  OracleCommand::ExecuteNonQuery()
(ENTRY) OpsErrGetOpoCtx()
(ERROR) Oracle error code=1405; ORA-01405: fetched column value is NULL
(EXIT)  OpsErrGetOpoCtx(): RetCode=0 Line=137
(ENTRY) OracleConnection::Dispose()
(ENTRY) OracleConnection::Close()

我对测试/目标应用程序之间的不同之处感到茫然。这两个进程都作为本地Administrators组的成员运行。两者都使用相同的连接字符串。两者都运行相同的.NET代码,但与数据库服务器的结果不同。可能会发生什么?

2 个答案:

答案 0 :(得分:2)

此错误来自旧的OCI&预编译代码,其中需要设置指示符变量以指示字段的空返回。如果未声明指示符变量,则在遇到空值时会触发此错误。显然,一些旧的代码仍然在您调用的情况下分层。

换句话说,这是一个数据问题。我不知道从哪里开始随便看。

答案 1 :(得分:0)

事实证明,我的目标应用程序在分布式XA事务处理中执行我的插件代码(在我的情况下是MSDTC)。对DBMS_AQADM.START_QUEUE的调用有一个我不知道的隐含COMMIT;。在这种情况下,错误信息显然毫无帮助。

解决方案是将我的电话打包在以下内容中:

using (var scope = new TransactionScope(TransactionScopeOption.Surpress))
{
    // execute DBMS_AQADM.START_QUEUE code here
    scope.Complete();
}

这会导致对DBMS_AQADM.START_QUEUE的调用在环境事务之外运行。