私は、この質問がすでに回答されていることを理解し、その質問に言及しました。ただし、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 オーバーライド静的メンバー コンストラクター マップ
よろしくお願いします
ありがとう