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
语句应该是代码块的一部分,而您没有,因此您必须添加 BEGIN
和 END
。像这样:
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;
/
已编辑 以匹配问题编辑(如评论中指出)。
我正在尝试构建一个需要一些异常处理的 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
语句应该是代码块的一部分,而您没有,因此您必须添加 BEGIN
和 END
。像这样:
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;
/
已编辑 以匹配问题编辑(如评论中指出)。