1

関数の引数を使用して動的に生成している ORACLE 関数にカーソルがあります。

カーソルのテキストを定義し、場合によっては次のステートメントを含めます。

      sql_stmt := sql_stmt || 'AND MOD ( LOG_ID, :logsetmax ) = :logset ';

カーソルを開き、ORACLE OPEN-FOR-USING ステートメントを使用して引数を渡します (たとえば、:logsetmax を 3 に設定し、:logset を 0 に設定します)。

プログラムに上記の制約が含まれていると、プログラムがハングし、ORA-03113 および ORA-03114 エラーが発生します。

ORACLE は、(USING で渡された):logsetmax のカーソル引数をカーソル宣言の MOD 関数にバインドすることを妨げており、この予測できない動作を引き起こしていますか?

私のエラーは、ORACLE 接続のタイムアウトを引き起こしているバインドされていない引数によるゼロ除算によるものと思われますか?

どんな提案でも大歓迎です。

アップデート

実用的な解決策として、SQL を修正してカーソル バインドからこれらの制約を削除し、次のように SQL にハード コードしました。

            sql_stmt := sql_stmt || 'AND MOD ( LOG_ID, ' || p_logsetmax || ' ) = ' || p_logset || ' ';
4

1 に答える 1

2

ORA-03113:通信チャネルのファイルの終わりエラーは一般的なエラーです。接続時のORA-03113エラーは、接続が確立されたが、タイムアウトのように後で失われたことを示しています。

ORA-03113エラーには多くの原因が考えられます。

ORA-3113は、次のいずれかのシナリオで通知される可能性があります。

  • マシンがクラッシュしました
  • サーバープロセスがO/Sレベルで強制終了されました
  • ネットワークの問題
  • サーバーでのOracle内部エラー/異常終了
  • クライアントが複数の接続を誤って処理している
  • など。考えられる原因がたくさん

処置:通信エラーが発生したため、さらに調査する必要があります。まず、ネットワークの問題を確認し、SQL*Netの設定を確認します。また、alert.logファイルでエラーを確認してください。最後に、サーバープロセスが停止しているかどうか、および障害時にトレースファイルが生成されたかどうかをテストします。

ソース:ora-code.com

于 2010-02-01T09:50:53.890 に答える