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.
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;
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;
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;
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.
Ce n'est pas disponible en 10g, mais c'est un nouvelle fonctionnalité en 11G
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?
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;
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.