Оператор цикла управления из блока исключений Oracle - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу знать, есть ли в Oracle возможность каким-либо образом перенаправить элемент управления из блока исключений в текущий блок начала / конца.

Ниже приведен фрагмент кода. переменная i перебирает наборы данных таблицы, я хочу обновить таблицу i ;если есть какое-либо исключение, перейдите в блок исключений exec1 , выполните все действия и попробуйте обновить таблицу i снова.

Если управление переходит к exec2 исключение, затем переходите к следующей итерации.

Мне нужна помощь, поскольку после выполнения шагов в исключении exec1 , как я могу попробовать обновить таблицу (i) снова;так что если он снова не удастся, он будет обработан в exec1 блок исключений.

FOR i in c_tables
  LOOP
  BEGIN
   ---label---
   Update (i);
   DBMS_OUTPUT.PUT_LINE ('ROWS UPDATED IS: ' || SQL%ROWCOUNT);
 EXCEPTION
  WHEN  exec1 THEN
    BEGIN
     do_stuff();
     goto label;
   EXCEPTION WHEN exec2 THEN 
  do_stuff();
   continue;
   END;    
 END;
 END LOOP;

1 Ответ

0 голосов
/ 10 декабря 2018

Я пытался смоделировать то, что у вас есть, в схеме Скотта.

Кажется, вам было бы хорошо, если бы вы переместили ярлык перед BEGIN, а не после него.Взгляните:

SQL> DECLARE
  2     l_deptno_dflt   NUMBER := 50;
  3  BEGIN
  4     FOR i IN (SELECT distinct deptno FROM emp)
  5     LOOP
  6        <<this_is_label>>           -- put label here ...
  7        BEGIN
  8        -- <<this_is_label>>        -- ... not here
  9           UPDATE emp
 10              SET deptno = l_deptno_dflt
 11            WHERE deptno = i.deptno;
 12
 13           DBMS_OUTPUT.put_line ('rows updated is ' || SQL%ROWCOUNT);
 14        EXCEPTION
 15           WHEN OTHERS
 16           THEN
 17              DBMS_OUTPUT.put_line ('this is exec1');
 18
 19              BEGIN
 20                 l_deptno_dflt := 40;
 21                 goto this_is_label;
 22              END;
 23        END;
 24     END LOOP;
 25  END;
 26  /
this is exec1
rows updated is 6
rows updated is 5
rows updated is 3

PL/SQL procedure successfully completed.

SQL>

Если это именно то место, где вы его изначально поместили, то возникает упомянутая ошибка PLS-00375.

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