PL/SQL 中的异常问题

Problems with exception in PL/SQL

我正在尝试构建一个需要一些异常处理的 INSERT INTO 查询。

目前的代码如下:

declare
  nvid number := 4561;
  fromMot number;
  toMot number;
begin
  for idx in 1..10 loop
    for fwd in 0..1 loop

      if fwd=0 then fromMot:=idx; toMot:=8; 
      else fromMot:=8; toMot:=idx; 
      End if;

      insert into MOT_BUFFER_TIME(MBT_ID,MBT_NV_ID,MBT_START_MOT_ID,MBT_END_MOT_ID,MBT_BUFFER_TIME)
      values ((select max(mbt.MBT_ID)+1 from MOT_BUFFER_TIME mbt),nvid,fromMot,toMot,600);
      exception
        when dup_val_on_index then 
          UPDATE MOT_BUFFER_TIME set MBT_BUFFER_TIME=600 where MBT_NV_ID=nvid and MBT_START_MOT_ID=fromMot and MBT_END_MOT_ID=toMot;
    end loop;
  end loop;
end;
/

table 为一些 MBT_START_MOT_ID 和 MBT_END_MOT_ID 组合插入一些缓冲时间(全部 600)。这些是 n-8 和 8-n,我选择使用嵌套的 FOR 循环。

问题是 table 已经有一些条目(通常是 8-5 和 5-8),它们具有不同的值,需要更改为 600,而 MBT_ID 是主键,有一个约束,即MBT_NV_ID、MBT_START_MOT_ID和MBT_END_MOT_ID的组合需要唯一。

所以我想我会写一个异常,这样如果有一个重复的错误,我会更新。

问题是 PL/SQL 开发人员抱怨 exception 的位置,告诉我它期待其他东西,并且还在倒数第二个抱怨意外 loop行。

很明显我做错了什么,但我看不出是什么。 有什么提示吗?谢谢

编辑:在值部分的第一个字段中添加了“+1”,因为如果没有它,它就会提取一个已经使用过的主键值。

除了实际避免问题(例如 OldProgrammer 建议)之外,EXCEPTION 语句应该是代码块的一部分,而您没有,因此您必须添加 BEGINEND。像这样:

declare
  nvid number := 4561;
  fromMot number;
  toMot number;
begin
  for idx in 1..10 loop
    for fwd in 0..1 loop

      if fwd=0 then fromMot:=idx; toMot:=8; 
      else fromMot:=8; toMot:=idx; 
      End if;

      BEGIN
        insert into MOT_BUFFER_TIME(MBT_ID,MBT_NV_ID,MBT_START_MOT_ID,MBT_END_MOT_ID,MBT_BUFFER_TIME)
        values ((select max(mbt.MBT_ID)+1 from MOT_BUFFER_TIME mbt),nvid,fromMot,toMot,600);
      exception
        when dup_val_on_index then 
          UPDATE MOT_BUFFER_TIME set MBT_BUFFER_TIME=600 where MBT_NV_ID=nvid and MBT_START_MOT_ID=fromMot and MBT_END_MOT_ID=toMot;
      END;
    end loop;
  end loop;
end;
/

已编辑 以匹配问题编辑(如评论中指出)。