私は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カーソルを試しましたが、それらを機能させるには、(私の限られた理解から)事前に行タイプを知る必要があります。すぐに実行しようとしましたが、これを適切な方法でループする方法が見つかりません。これに取り組む他の方法はありますか?
追加:
このように問題を解決するのではなく、問題の原因を修正する必要があることを認識しています。残念ながら、問題は私の影響範囲から大きく外れています。
別の手順を作成せずにこれを実行し、すべてのテーブル参照をループでラップすることは可能ですが、これを最後の手段として残しておきます。