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

Oracle SQL查询仅在一个进程中失败:“0”;ORA-01405:获取的列值为空";,sql,oracle,stored-procedures,odp.net,advanced-queuing,Sql,Oracle,Stored Procedures,Odp.net,Advanced Queuing,我试图在我构建的“插件”中调用一个系统存储过程。当我在测试应用程序中测试我的插件时,它运行良好。当我在为其构建的目标应用程序中运行插件时,我从Oracle得到了一个没有任何意义的异常 我使用的是Oracle server 11.2.0.1.0和ODP.NET 2.112.2.0 以下是我的测试应用程序中ODP.NET的调试跟踪: (ENTRY) OracleConnection::OracleConnection(1) (POOL) New connection pool created fo

我试图在我构建的“插件”中调用一个系统存储过程。当我在测试应用程序中测试我的插件时,它运行良好。当我在为其构建的目标应用程序中运行插件时,我从Oracle得到了一个没有任何意义的异常

我使用的是Oracle server 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代码,但与数据库服务器的结果不同。这可能是怎么回事?

此错误来自旧的OCI&prec编译代码,其中需要设置一个指示符变量以指示字段的空返回。当未声明任何指示符变量时,如果遇到空值,则会触发此错误。显然,一些较旧的代码仍然存在于您所做的调用之下


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

事实证明,我的目标应用程序在分布式XA事务中执行我的插件代码(在我的例子中是MSDTC)。对
DBMS\u AQADM.START\u QUEUE
的调用有一个隐式的
COMMIT我不知道的。在这种情况下,错误消息显然毫无帮助

解决方案是将我的呼叫打包为以下内容:

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

这会导致对
DBMS\u AQADM.START\u QUEUE
的调用在环境事务之外运行。

我们可以看到失败的提取吗?@ninesided不幸的是,我无法访问反编译的DBMS\u AQADM.START\u QUEUE过程代码以了解其来源。是的,我已经深入研究了ORA-01405错误,但运气不好。这怎么可能是一个过程中的数据问题而不是另一个过程中的数据问题?