Ключевое слово «ПРОДОЛЖЕНИЕ» в Oracle 10g PL / SQL - PullRequest
36 голосов
/ 07 октября 2008

Я переносу хранимую процедуру TSQL в PL / SQL и столкнулся с проблемой - отсутствием ключевого слова CONTINUE в Oracle 10g.

Я читал, что Oracle 11g имеет это как новую функцию, но обновление, к сожалению, не вариант.

Есть ли альтернатива ПРОДОЛЖИТЬ в 10g? Я не верю, что практично реструктурировать логику SP как обходного пути, потому что у меня есть внешний цикл, IF, затем вложенный IF, затем CONTINUE в конце блока операторов в этом IF. 1005 *

Любая помощь будет принята с благодарностью, ура.

Ответы [ 8 ]

56 голосов
/ 07 октября 2008

Вы можете смоделировать продолжение, используя goto и метки .

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         GOTO end_loop;
      END IF;
   <<end_loop>>  -- not allowed unless an executable statement follows
   NULL; -- add NULL statement to avoid error
   END LOOP;  -- raises an error without the previous NULL
END;
10 голосов
/ 12 марта 2009

Хотя это немного сложно и просто подделка, вы можете использовать исключение следующим образом:

DECLARE
  i NUMBER :=0;
  my_ex exception;
BEGIN
  FOR i IN 1..10
  LOOP
      BEGIN
         IF i = 5 THEN
            raise my_ex;
         END IF;
         DBMS_OUTPUT.PUT_LINE (i);
      EXCEPTION WHEN my_ex THEN
         NULL;
      END;
  END LOOP;

END;
6 голосов
/ 11 июля 2013

Для будущих поисков, в oracle 11g добавили оператор continue, который можно использовать так:

    SQL> BEGIN
  2     FOR i IN 1 .. 5 LOOP
  3        IF i IN (2,4) THEN
  4           CONTINUE;
  5        END IF;
  6        DBMS_OUTPUT.PUT_LINE('Reached on line ' || TO_CHAR(i));
  7     END LOOP;
  8  END;
  9  /
Reached on line 1
Reached on line 3
Reached on line 5

PL/SQL procedure successfully completed.
6 голосов
/ 22 августа 2011

На самом деле PL PL имеет что-то, чтобы заменить CONTINUE. Все, что вам нужно сделать, это добавить метку (имя) в цикл:

declare
   i integer;
begin
   i := 0;

   <<My_Small_Loop>>loop

      i := i + 1;
      if i <= 3 then goto My_Small_Loop; end if; -- => means continue

      exit;

   end loop;
end;
5 голосов
/ 28 октября 2008

Это не доступно в 10g, однако это новая функция в 11G

4 голосов
/ 07 октября 2008

Можете ли вы преобразовать IF в функцию, вернувшись в соответствующую точку (при необходимости, раньше). Затем поток управления будет подхвачен в цикле в нужном месте.

Имеет ли это смысл?

2 голосов
/ 04 сентября 2009

Не совсем элегантно, но просто:

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;
1 голос
/ 07 октября 2008

В Oracle есть похожая инструкция EXIT, которая либо выходит из цикла, либо из функции / процедуры (если нет цикла для выхода из). Вы можете добавить КОГДА для проверки некоторых условий.

Вы можете переписать приведенный выше пример следующим образом:

DECLARE
   done  BOOLEAN;
BEGIN
    FOR i IN 1..50 LOOP
     EXIT WHEN done;
   END LOOP;
END;

Этого может быть недостаточно, если вы хотите выйти из глубины некоторых вложенных циклов и логики, но намного понятнее, чем пара GOTO и NULL.

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