0

私はOracleにかなり慣れていないので、これが可能かどうかは完全にはわかりません。

私が修正している古いフィーダースクリプトの一部は、関連するステージングテーブルにデータを入力するために、最大20個のテーブル(いつでも変更される可能性があります)をループしています。この部分は現在非常に基本的です:

...

INSERT INTO staging_tbl_1(
     SELECT *
     FROM source_tbl_1    
);

INSERT INTO staging_tbl_2(
         SELECT *
         FROM source_tbl_2    
);

...

ソースデータベースの一部のフィールドには異なる制約などがあります。つまり、時々例外がスローされ、フィーダーが停止します。私が望んでいるのは、既存のフィーダーパッケージ内にプロシージャを作成して、挿入される前に各レコードの各行をループし、例外ブロックでラップすることです。このようにして、フィーダーを停止させることなくログに記録できます。

基本的に私はこのようなものを追いかけています:

BEGIN procedure_x(source_record, staging_record)

  -- Perform validation to ensure records exit

  -- Loop through all record rows
  FOR row IN (SELECT * FROM source_record) LOOP

     -- Wrap in exception block

     -- Insert into staging record

     -- Log exception if it occurs
  END LOOP;         
END

私はrefカーソルを試しましたが、それらを機能させるには、(私の限られた理解から)事前に行タイプを知る必要があります。すぐに実行しようとしましたが、これを適切な方法でループする方法が見つかりません。これに取り組む他の方法はありますか?

追加:

このように問題を解決するのではなく、問題の原因を修正する必要があることを認識しています。残念ながら、問題は私の影響範囲から大きく外れています。

別の手順を作成せずにこれを実行し、すべてのテーブル参照をループでラップすることは可能ですが、これを最後の手段として残しておきます。

4

1 に答える 1

1

Oracleには、DMLエラーをログに記録する機能があります。単一のSQLステートメントで使用します。行ごとに移動してプロセスをクロールさせないでください。

http://docs.oracle.com/cd/B19306_01/server.102/b14231/tables.htm#ADMIN10261

于 2012-08-01T14:25:12.227 に答える