EXCEPTION放错位置了吗?放置它的最佳位置在哪里?

时间:2018-10-09 19:09:16

标签: oracle plsql

因此,我试图通过游标循环创建条目;但是,我正在尝试处理循环内的异常(DUP_VAL_ON_INDEX)。这可能吗?如果是这样,我在做什么错?下面是我的代码:

create or replace Procedure EY IS
CURSOR c1 is 
  select ey_id , cycle_id
  from mvs v
 cross join cycle s
 l_var c1%ROWTYPE;
   BEGIN
      OPEN c1;
   LOOP
      BEGIN
        FETCH c1 into l_var;
        EXIT when c1%NOTFOUND;
      insert into EY (EY_id, cycle_id, create_dt, create_user_id)
      values (l_var.ey_id, l_var.cycle_id, trunc(sysdate), '1');
        EXCEPTION
            WHEN DUP_VAL_ON_INDEX THEN
            DBMS_OUTPUT.PUT_LINE('duplicate value');  
  END LOOP;
    close c1;
END EY;

预先感谢

1 个答案:

答案 0 :(得分:2)

是的,这是在发生某些情况时继续执行LOOP的方法-将循环内容包含在其自己的BEGIN-EXCEPTION-END块中。

您的代码似乎还可以,但是它缺少所提及的内部END END 块的BEGIN-EXCEPTION-语句,即

create or replace Procedure EY IS
  CURSOR c1 is 
    select ey_id , cycle_id
    from mvs v
    cross join cycle s
  l_var c1%ROWTYPE;
BEGIN
  OPEN c1;
  LOOP
    BEGIN
      FETCH c1 into l_var;
      EXIT when c1%NOTFOUND;
      insert into EY (EY_id, cycle_id, create_dt, create_user_id)
        values (l_var.ey_id, l_var.cycle_id, trunc(sysdate), '1');
    EXCEPTION
      WHEN DUP_VAL_ON_INDEX THEN
      DBMS_OUTPUT.PUT_LINE('duplicate value');  
    end;                   --> you're missing this END
  END LOOP;
  close c1;
END EY;

如果正确缩进代码,则更容易发现罪魁祸首。