3

作成した「プラグイン」でシステムストアドプロシージャを呼び出そうとしています。プラグインをテストアプリケーションでテストすると、正常に動作します。構築しているターゲットアプリでプラグインを実行すると、Oracleから意味のない例外が発生します。

Oracleサーバー11.2.0.1.0とODP.NET2.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コードを実行していますが、データベースサーバーとは結果が異なります。ここで何が起こっているのでしょうか?

4

2 に答える 2

2

このエラーは、フィールドのnullリターンを示すためにインジケータ変数を設定する必要があった古いOCIおよびprecでコンパイルされたコードに起因します。インジケーター変数が宣言されていない場合、null値が検出されると、このエラーがトリガーされます。明らかに、いくつかの古いコードは、あなたが行った呼び出しの下にまだ階層化されています。

言い換えれば、それはデータの問題です。どこから始めたらいいのかわからない。

于 2011-10-11T16:27:53.083 に答える
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はアンビエントトランザクションの外部で実行されます。

于 2011-10-11T18:39:53.870 に答える