現在、次のようにデータをOracleデータベースにインポートして変換しています。
プログラムは定期的に特定のフォルダーをポーリングします。ファイルが見つかると、Pythonとbashで軽い変換を行うバッチファイルを実行し、SQL*Loaderを呼び出してCSVファイルをステージングテーブルにロードします。
次に、バッチスクリプトはSQLスクリプトを(SQLPlusを介して)呼び出して最終的な変換を実行し、変換されたデータをそれぞれのステージングテーブルのマスターテーブルに挿入します。
この方法の問題は、SQLPlus側にエラー処理がないことです。違反した制約(またはその他の理由)が原因で「insertinto」ステートメントが失敗した場合でも、SQLスクリプトに含まれる残りのステートメントを実行し続けます。
理想的には、例外が発生した場合は、すべての変更をロールバックし、例外の詳細をetlログテーブルに挿入することをお勧めします。
例外処理が組み込まれているため、ストアドプロシージャは適しているようです。ただし、構文に苦労しています。具体的には、大きなSQLスクリプト(INSERT INTO、UPDATE、CREATE、DROP、DELETEなどのステートメントの組み合わせ)を取得して、いくつかの非常に基本的なエラー処理。
私が望んでいるのは次のいずれかです。
- PL / SQLの気のめいるblobを取得し、ストアドプロシージャ内で実行するためのクイックでダーティなダミーのガイドまたは
- 同じ機能を提供する代替(ストアドプロシージャが適切でない場合)。一連のSQLステートメントを実行し、これらのステートメントのいずれかが例外をスローした場合にロールバックする方法。
私の試みについて-SQLスクリプトの一部をストアドプロシージャにコピーしようとしましたが、常にエラー「PLS-00103次のいずれかが必要なときにシンボルが発生しました」でコンパイルに失敗します。例えば。
CREATE OR REPLACE PROCEDURE ETL_2618A AS
BEGIN
DROP SEQUENCE "METER_REPORTING"."SEQ_2618";
CREATE SEQUENCE SEQ_2618;
END ETL_2618A;
Oracleのドキュメントにはひどくアクセスできず、StackOverflowをグーグルで検索したり、検索したりすることはあまりできませんでしたが、明らかなことを見逃してしまったことをお詫びします。