Я пытаюсь создать запрос 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;
/
В таблицу добавлено некоторое время буфера (все 600) для ряда комбинаций MBT_START_MOT_ID и MBT_END_MOT_ID. Это n-8 и 8-n, которые я выбрал для вложенных циклов FOR.
Проблема в том, что в таблице уже есть некоторые записи (обычно 8-5 и 5-8), которые имеют другое значение, которое необходимо изменить на 600, и, хотя MBT_ID является первичным ключом, существует ограничение, что комбинация MBT_NV_ID, MBT_START_MOT_ID и MBT_END_MOT_ID должны быть уникальными.
Поэтому я подумал, что напишу исключение, например, если в случае дублирующейся ошибки я обновлю.
Проблема в том, что разработчик PL / SQL жалуется на размещение exception
, говорит, что ожидает чего-то другого, а также жалуется на неожиданный loop
на предпоследней строке.
Очевидно, что я сделал что-то не так, но я не вижу, что.
Есть намеки? Спасибо.
EDIT: добавлено «+1» к первому полю в разделе значений, потому что без него оно вытягивало значение первичного ключа, которое уже использовалось.