2

現在、次のようにデータを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をグーグルで検索したり、検索したりすることはあまりできませんでしたが、明らかなことを見逃してしまったことをお詫びします。

4

3 に答える 3

3

PL / SQLでDDLを実行するには、動的SQLを使用する必要があります。

CREATE OR REPLACE PROCEDURE testProc IS
   s_sql    VARCHAR2(500);
BEGIN
   s_sql := 'DROP SEQUENCE "METER_REPORTING"."SEQ_2618"';
   EXECUTE IMMEDIATE s_sql;


   s_sql := 'CREATE SEQUENCE "METER_REPORTING"."SEQ_2618"';
   EXECUTE IMMEDIATE s_sql;

EXCEPTION

   WHEN OTHERS THEN
       NULL;
end testProc;
/
于 2012-05-31T03:44:25.970 に答える
0

PL / SQLプロシージャまたはスクリプトに例外処理を追加することは難しくありませんが、もちろん、ある程度のコーディングが必要です。非常に基本的なエラーレポートを追加して、手順を少しドレスアップします。

CREATE OR REPLACE PROCEDURE ETL_2618A AS
  nCheckpoint  NUMBER;
BEGIN
  nCheckpoint := 1;

  EXECUTE IMMEDIATE 'DROP SEQUENCE "METER_REPORTING"."SEQ_2618"';

  nCheckpoint := 2;

  EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_2618';

  RETURN;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('ETL_2618A failed at checkpoint ' || nCheckpoint ||
                         ' with error ' || SQLCODE || ' : ' || SQLERRM);
    RAISE;
END ETL_2618A; 

動物でテストされていません-あなたが最初になります!:-)

于 2012-05-31T11:24:15.517 に答える
0

sqlplus でスクリプトを実行する場合は、次を使用できます。

いつでもsqlerror

エラーが発生したときに何が起こるべきかを制御します。

http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm

于 2012-05-31T08:42:43.227 に答える