Проблемы с исключением в PL / SQL - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать запрос 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» к первому полю в разделе значений, потому что без него оно вытягивало значение первичного ключа, которое уже использовалось.

1 Ответ

0 голосов
/ 02 мая 2018

Помимо фактического избежания проблемы (например, как предложено 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;
/

Отредактировано для соответствия редактированию вопроса (как указано в комментарии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...