我知道这个问题已经得到回答,我已经提到了那个问题。但是,当我尝试编译以下代码时,我试图通过包含 INSERT 语句的 LOOP,如果插入语句不成功,我需要检查 DML-insert 失败引发的错误是否是 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 lock insert open rollback savepoint set sql execute commit forall merge pipe purge
错误(56,7):PLS-00103:在预期以下情况之一时遇到符号“LOOP”:;
错误(59):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:结束不是 pragma 最终实例化顺序覆盖静态成员构造函数映射
非常感谢您的帮助
谢谢