2017-12-06 29 views
1

表Aから表Bへデータをコピーしています。表Aでは、国(EN、ES、RU、UK)の4つの列があります。国ごとの列は、表Bの別個の行です。さらに、表Bの各行は複製され、次の順序番号を受け取る必要があります。DBMS_OUTPUTでの配列とエラー処理への一括収集

表A - 私のカーソル

+---------+---------+---------+---------+---------+ 
| Company | EN | ES | RU | UK | 
+---------+---------+---------+---------+---------+ 
| Intel | 123 345 | 453 343 | 444 101 | 110 232 | 
+---------+---------+---------+---------+---------+ 

表B表Aでは

+---------+---------+-----+ 
| Company | Country | SEQ | 
+---------+---------+-----+ 
| Intel | 123 345 | 0 | 
| Intel | 123 345 | 1 | 
| Intel | 453 343 | 0 | 
| Intel | 453 343 | 1 | 
| INTEL | 444 101 | 0 | 
| INTEL | 444 101 | 1 | 
| INTEL | 110 232 | 0 | 
| INTEL | 110 232 | 1 | 
+---------+---------+-----+ 

私は1,000,000行を持っています。
表Bでは、1,000,000(行)x 4(国)x 2(seq)= 8,000,000が必要です。

データを挿入する手順を準備しました。表BにDMLエラーの場合

BEGIN 

OPEN my_cursor; 
    LOOP 
     EXIT WHEN my_cursor%notfound; 
     FETCH my_cursor BULK COLLECT INTO TAB LIMIT 500; 

     FOR y in 0..1 LOOP 

       FORALL x IN TAB.first..TAB.last 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y); 

       FORALL x IN TAB.first..TAB.last 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."ES", y); 

       FORALL x IN TAB.first..TAB.last 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."RU", y); 

       FORALL x IN TAB.first..TAB.last 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."UK", y); 

     END LOOP; 

     COMMIT; 
    END LOOP;  
CLOSE my_cursor; 

END; 

、私は一緒に、例えばDBMS_OUTPUT のエラーコードをアレイ(タブ)の変数の値を返すことがあります

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM); 

ですそのようなエラーを処理することは可能ですか?どのようにしてこのようなソリューションを実装できますか? 。

答えて

-1

​​命令を使用して目標を達成できます。 これは、次のあなたを与えるだろう:

DECLARE 
    ln_error_count NUMBER; 
    ln_line_error NUMBER; 
BEGIN 

    OPEN my_cursor; 
    LOOP 
     EXIT WHEN my_cursor%notfound; 
     FETCH my_cursor BULK COLLECT INTO TAB LIMIT 500; 

     FOR y in 0..1 LOOP 

      BEGIN 
       FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y); 
      EXCEPTION 
       WHEN ex_dml_errors THEN 
        ln_error_count := SQL%BULK_EXCEPTIONS.count; 
        FOR i IN 1 .. ln_error_count LOOP 
         ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index; 
         DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."EN" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
        END LOOP; 
      END; 

      BEGIN 
       FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."ES", y); 
      EXCEPTION 
       WHEN ex_dml_errors THEN 
        ln_error_count := SQL%BULK_EXCEPTIONS.count; 
        FOR i IN 1 .. ln_error_count LOOP 
         ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index; 
         DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."ES" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
        END LOOP; 
       END; 

      BEGIN 
       FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."RU", y); 
      EXCEPTION 
       WHEN ex_dml_errors THEN 
        ln_error_count := SQL%BULK_EXCEPTIONS.count; 
        FOR i IN 1 .. ln_error_count LOOP 
         ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index; 
         DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."RU" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
        END LOOP; 
      END; 

      BEGIN 
       FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."UK", y); 
      EXCEPTION 
       WHEN ex_dml_errors THEN 
        ln_error_count := SQL%BULK_EXCEPTIONS.count; 
        FOR i IN 1 .. ln_error_count LOOP 
         ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index; 
         DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."UK" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
        END LOOP; 
      END; 
     END LOOP; 

     COMMIT; 
    END LOOP;  
    CLOSE my_cursor; 

END; 
+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18182580) –

+0

コメントありがとうございます@ max23_私はそれに応じて自分の投稿を更新しました。 – Guillaume

0

はい、あなたは、このようなエラーを処理し、使用してすべての挿入を継続することができ、以下のようFORALLSAVE EXCEPTIONS:すべての文が実行された後 PLSQLがORA:24381を発生させます。

BEGIN 
FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS 
        INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y); 
EXCEPTION 
WHEN OTHERS THEN 
IF sqlcode = -24381 
    FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
     LOOP 
      DBMS_OUTPUT.put_line (
        SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX 
       || ‘: ‘ 
       || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE); 
     END LOOP; 
else 
raise; 
end if; 
END; 
関連する問題