【问题标题】:Continuing the loop from exception block从异常块继续循环
【发布时间】:2013-02-05 12:30:16
【问题描述】:

我知道这个问题已经得到回答,我已经提到了那个问题。但是,当我尝试编译以下代码时,我试图通过包含 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

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

错误(59):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:结束不是编译指示最终可实例化顺序覆盖静态成员构造函数映射

非常感谢您的帮助

谢谢

【问题讨论】:

标签: oracle11g


【解决方案1】:

您在循环之后缺少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。

【讨论】:

  • 嗨,Dazzal,我身边的人……对不起,非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2018-03-20
  • 2015-08-19
  • 2021-03-25
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多