6

インライン ビュー内のコレクション内の要素からコレクションを作成する必要があります。コレクションを集約解除し、collect および table 関数を使用して再度集約しようとしましたが、ORA-03113 で失敗します。

以下は、問題の原因となっているクエリの簡略化されたバージョンです。

私の実装では、すべてのコレクションを単一のコレクションに集約する必要がある単一のクエリで、ユニオンで結合された多くのレベルのネストされたクエリを使用します。パフォーマンス上の理由 (高価なコンテキスト切り替え) から、PL/SQL コードを実装してコレクションを集約することはできません。

フィードバック/提案をありがとうございます。

脚本


SELECT BANNER FROM V$VERSION
/

CREATE OR REPLACE TYPE OBJECT_ID_TAB_T IS TABLE OF NUMBER(11);
/

SELECT OWNER, CAST(COLLECT( MULTISET(SELECT COLUMN_VALUE FROM TABLE((OBJECT_ID_LIST) ))) AS OBJECT_ID_TAB_T) AS OBJECT_ID_LIST
FROM  (SELECT OWNER, OBJECT_NAME, CAST(COLLECT(OBJECT_ID) AS OBJECT_ID_TAB_T)  AS OBJECT_ID_LIST
       FROM ALL_OBJECTS
       GROUP BY OWNER, OBJECT_NAME
      )
GROUP BY OWNER
/

結果


BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production    
PL/SQL Release 11.2.0.1.0 - Production                                          
CORE    11.2.0.1.0  Production                                                      
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production                         
NLSRTL Version 11.2.0.1.0 - Production                                          

5 rows selected.
Type created.
SELECT OWNER, CAST(COLLECT( MULTISET(SELECT COLUMN_VALUE FROM TABLE((OBJECT_ID_LIST) ))) AS OBJECT_ID_TAB_T) AS OBJECT_ID_LIST
FROM  (SELECT OWNER, OBJECT_NAME, CAST(COLLECT(OBJECT_ID) AS OBJECT_ID_TAB_T)  AS OBJECT_ID_LIST
       FROM ALL_OBJECTS
       GROUP BY OWNER, OBJECT_NAME
      )
GROUP BY OWNER
*
Error at line 0
ORA-03113: end-of-file on communication channel
Process ID: 8000
Session ID: 154 Serial number: 164

Script Terminated on line 25.
4

1 に答える 1

1

ORA-03113 : end-of-file on communication channel エラーは一般的なエラーです。ここに質問を投稿した場合はおそらくご存知でしょう。そのため、考えられる原因に飽き飽きするのではなく、問題を解決するために役立つ事項のリストを次に示します。このエラーは非常に一般的であるため、誰かが正確な原因を見つける可能性は低いため、ログ ファイルやトレース ファイルを調べて、この特定のエラーをデバッグする方法を学ぶ必要があります。

提案: まず、クエリに必要なメモリを減らし、複雑さを軽減する方法を提案したいと思います。中間テーブルを作成し、別の手順でクエリを実行します。Oracle でメモリの問題が発生している可能性があり (特に Windows の場合)、リスナーがメモリ不足になり、接続が終了するという問題が発生する可能性があります。PL*SQLを使用したくないと言ったので、ストレートSQLでこれを行うことができます。

問題解決のアイデア: サーバーの alert_sid.log を確認します。alert_sid.log の場所は、Background_DUMP_DEST 初期化パラメータによって指定されます。サーバーがダウンしたことを示している可能性があります。再送信回数を変更する必要がある場合があります。次に、他の Oracle トレース ファイルを確認します。

Oracle 構成ファイルを使用してトレース オプションを設定します。


1. SQLNET.ORA

  • Oracle Net Managerを使用して設定

  • TRACE_DIRECTORY_CLIENT クライアント トレース出力の宛先ディレクトリを確立します。デフォルトでは、クライアント ディレクトリは、UNIX では $ORACLE_HOME/network/trace、Windows では ORACLE_HOME\network\trace です。

  • TRACE_DIRECTORY_SERVER - データベース サーバーのトレース出力の宛先ディレクトリを確立します。デフォルトのサーバー ディレクトリは、UNIX では $ORACLE_HOME/network/trace、Windows では ORACLE_HOME\network\trace です。

2.リスナー.ORA

  • Oracle Enterprise ManagerまたはOracle Net Managerを使用して設定

  • TRACE_LEVEL_listener_name - トレース機能がリスナーについて記録する詳細レベルを指定します。- off (0 に相当) はトレースを提供しません - user (4 に相当) トレースはユーザーが引き起こしたエラー状態を識別します - admin (6 に相当) トレースはインストール固有の問題を識別します - support (16 に相当) はトレース情報を提供しますOracleサポート・サービスのトラブルシューティング情報

  • TRACE_DIRECTORY_listener_name - トレース ファイルの宛先ディレクトリとファイルを確立します。デフォルトのディレクトリは、UNIX では $ORACLE_HOME/network/trace、Windows では ORACLE_HOME\network\trace で、ファイル名は listener.trc です。


3.CMAN.ORA

  • Oracle Net Managerを使用して設定

  • TRACE_DIRECTORY - デフォルトのディレクトリは、UNIX では $ORACLE_HOME/network/trace、Windows では ORACLE_HOME\network\trace です。


さまざまな Oracle 構成ファイルで作成されたトレース ファイルを使用すると、エラーの根本原因を特定するために必要な情報が得られます。リスナーを取り巻く問題やメモリ不足による問題に焦点を当てます。

于 2012-10-27T00:27:50.047 に答える