【问题标题】:Oracle SQL query fails only in one process: "ORA-01405: fetched column value is NULL"Oracle SQL 查询仅在一个进程中失败:“ORA-01405: fetched column value is NULL”
【发布时间】:2011-12-05 11:12:02
【问题描述】:

我正在尝试在我构建的“插件”中调用系统存储过程。当我在测试应用程序中测试我的插件时,它工作正常。当我在为其构建它的目标应用程序中运行插件时,我从 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()

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

【问题讨论】:

  • 我们能看到失败的提取吗?
  • @nineside 不幸的是,我无权访问反编译的 DBMS_AQADM.START_QUEUE 过程代码以了解其来源。

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


【解决方案1】:

此错误来自旧的 OCI 和预编译代码,其中需要设置指示变量以指示字段返回空值。当没有声明指标变量时,如果遇到空值会触发此错误。显然,一些较旧的代码仍然在您所做的调用下分层。

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

【讨论】:

  • 是的,我已经深入研究了 ORA-01405 错误,但运气不佳。怎么可能是一个进程中的数据问题,而不是另一个进程?
【解决方案2】:

事实证明,我的目标应用程序在分布式 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 的调用在环境事务之外运行。

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多