web-dev-qa-db-fra.com

Mot-clé "CONTINUER" dans Oracle 10g PL / SQL

Je migre une procédure stockée TSQL vers PL/SQL et j'ai rencontré un problème - l'absence d'un mot clé CONTINUE dans Oracle 10g.

J'ai lu qu'Oracle 11g a cela comme une nouvelle fonctionnalité, mais la mise à niveau n'est malheureusement pas une option.

Existe-t-il une alternative à CONTINUER en 10g? Je ne pense pas qu'il soit pratique de restructurer la logique du SP comme solution de contournement, car j'ai une boucle externe, un IF, puis un IF imbriqué, puis le CONTINUE à la fin d'un bloc d'instructions au sein de cette IF.

Toute aide serait grandement appréciée, bravo.

36

Vous pouvez simuler une poursuite en utilisant goto et labels .

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;
56
jop

Bien que ce soit un peu complexe et juste un faux, vous pouvez utiliser l'exception de cette façon:

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;
10
Eric

En fait, PL SQL a quelque chose à remplacer CONTINUE. Tout ce que vous avez à faire est d'ajouter une étiquette (un nom) à la boucle:

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;
6
Sylvain Rodrigue

Pour les recherches futures, dans Oracle 11g, ils ont ajouté une instruction continue, qui peut être utilisée comme ceci:

    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
eric.itzhak

Ce n'est pas disponible en 10g, mais c'est un nouvelle fonctionnalité en 11G

5
Dilshod Tadjibaev

Pouvez-vous refactoriser les FI dans une fonction, en revenant au point approprié (tôt si nécessaire). Ensuite, le flux de contrôle reprendra dans la boucle au bon endroit.

Cela a-t-il du sens?

4
cagcowboy

Pas exactement élégant, mais simple:

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;
2
David Oneill

Dans Oracle, il existe une instruction similaire appelée EXIT qui quitte une boucle ou une fonction/procédure (s'il n'y a pas de boucle pour quitter). Vous pouvez ajouter un QUAND pour vérifier une condition.

Vous pouvez réécrire l'exemple ci-dessus comme suit:

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

Cela peut ne pas être suffisant si vous souhaitez quitter profondément certaines boucles et logiques imbriquées, mais c'est beaucoup plus clair que quelques GOTO et NULL.

1
Thorsten