0

我知道这个问题已经得到回答,我已经提到了那个问题。但是,当我尝试编译以下代码时,我试图通过包含 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 最终实例化顺序覆盖静态成员构造函数映射

非常感谢您的帮助

谢谢

4

1 回答 1

2

你在begin循环之后错过了一个。IE:

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而不是检查 sqlcode。

于 2013-02-20T13:33:20.643 回答