从异常块继续循环

时间:2013-02-20 13:25:05

标签: oracle11g

我知道这个问题已经得到解答,我已经提到了这个问题。但是,当我尝试编译以下代码,我试图通过一个包含INSERT语句的LOOP,如果insert语句不成功,我需要检查DML插入失败抛出的错误是否是UNIQUE约束或不,如果它是唯一约束错误(-1),那么我需要执行更新语句并继续循环。

Oracle版: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”:(如果使用<<<<<<<<<<<<<<<<<<<<<<继续关闭当前删除fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge

     

错误(56,7):PLS-00103:当遇到以下情况之一时遇到符号“LOOP”:

     

错误(59):PLS-00103:遇到以下其中一项时遇到符号“end-of-file”:end not pragma final instantiable order overriding static member constructor map

非常感谢您的帮助

由于

1 个答案:

答案 0 :(得分:2)

你的循环后错过begin。即:

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。