0

私は、この質問がすでに回答されていることを理解し、その質問に言及しました。ただし、INSERT ステートメントを含む LOOP を通過しようとしている次のコードをコンパイルしようとしているときに、挿入ステートメントが成功しない場合は、DML 挿入の失敗によってスローされたエラーが UNIQUE 制約であるかどうかを確認する必要があります。一意の制約エラー (-1) の場合は、更新ステートメントを実行してループを続行する必要があります。

オラクルのバージョン: 11g

 CREATE OR REPLACE PROCEDURE "TESTSAMPLE" AS



type array_test IS TABLE OF NUMBER;

test_arr array_test := array_test(1,   2,   3);

v_key NUMBER;
dup_chk NUMBER;
v_excp_error_code varchar2(25);


BEGIN

  FOR i IN test_arr.FIRST .. test_arr.LAST

  LOOP

    DBMS_OUTPUT.PUT_LINE(i || ' = ' || test_arr(i));
    dup_chk := test_arr(i);
    INSERT
    INTO trig_test
    VALUES('TEST324',   test_arr(i),   'Y',   'Y') returning KEY
    INTO v_key;

    IF v_key IS NOT NULL THEN
      DBMS_OUTPUT.PUT_LINE(' commiting insert ' || v_key || ' ' || dup_chk);
      COMMIT;
    END IF;

  EXCEPTION
  WHEN OTHERS THEN
    v_excp_error_code := SQLCODE;
    DBMS_OUTPUT.PUT_LINE('ERROR CODE = ' || v_excp_error_code);

    IF v_excp_error_code = '-1' THEN
      DBMS_OUTPUT.PUT_LINE('entered unique constraint exception ' || v_key);

      IF v_key = dup_chk OR v_key IS NULL THEN

        UPDATE trig_test
        SET status = 'tstsample'
        WHERE KEY = v_key;
        DBMS_OUTPUT.PUT_LINE('updated ');
        COMMIT;

      END IF;

    ELSE
      RAISE;
    END IF;
  END;  

  END LOOP;

END testsample;

上記のストアド プロシージャは、次のコンパイル エラーをスローしています。

エラー(33,3): PLS-00103: 次のいずれかを予期しているときに、シンボル「EXCEPTION」が検出されました: ( begin case declare end exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetchロック 挿入 オープン ロールバック セーブポイントの設定 SQL 実行 コミット forall マージ パイプ パージ

エラー(56,7): PLS-00103: 次のいずれかを予期しているときに、シンボル「LOOP」が見つかりました: ;

エラー (59): PLS-00103: 次のいずれかを予期しているときに、シンボル「ファイルの終わり」が発生しました: end not pragma final instanceiable order オーバーライド静的メンバー コンストラクター マップ

よろしくお願いします

ありがとう

4

1 に答える 1

2

beginループの後にa がありません。すなわち:

loop

  begin -- ADD THIS
    dbms_output.put_line(i || ' = ' || test_arr(i));
    dup_chk := test_arr(i);
    insert into trig_test
    values
      ('TEST324', test_arr(i), 'Y', 'Y')
    returning key into v_key;

    if v_key is not null
    then
      dbms_output.put_line(' commiting insert ' || v_key || ' ' || dup_chk);
      commit;
    end if;

  exception

ただし、トラップする代わりにothers、あなただけが興味を持っているので、代わりにトラップORA-00001することができwhen dup_val_on_index、SQLコードをチェックしません。

于 2013-02-20T13:33:20.643 に答える