'Continue' Schlüsselwort in Oracle 10g PL / SQL
Frage
Ich bin Migration eine TSQL gespeicherte Prozedur zu PL / SQL und habe ein Problem festgestellt -. Das Fehlen eines WEITES Schlüsselwort in Oracle 10g
Ich habe gelesen, dass Oracle 11g dies als neues Feature, aber Upgrade ist keine Option, leider.
Gibt es eine Alternative in 10g WEITER? Ich glaube nicht, es ist praktisch, um die Logik der SP als Behelfslösung zu restrukturieren, weil ich eine äußere Schleife haben, eine IF, dann eine verschachtelte IF, dann ist die am Ende eines Anweisungsblocks WEITER innerhalb dieser IF.
Jede Hilfe wäre sehr dankbar, Prost.
Lösung
Sie können eine Simulation weiter zu verwenden goto und Etiketten .
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;
Andere Tipps
Auch wenn es ein wenig komplex ist und nur ein Fake, können Sie Ausnahme auf diese Weise verwenden:
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;
In der Tat tut PL SQL etwas WEITER ersetzen müssen. Alles, was Sie tun müssen, ist ein Etikett (ein Name) an die Schleife hinzuzufügen:
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;
Für die Zukunft sucht, in Oracle 11g fügten sie eine continue
Aussage, die wie folgt verwendet werden kann:
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.
Es ist in 10 g nicht verfügbar, aber es ist ein neue Funktion in 11G
Können Sie Refactoring die IFs in eine Funktion, an der entsprechenden Stelle zurückkehren (early falls erforderlich). Dann geht der Steuerungsablauf wird in der Schleife am richtigen Ort abholen.
Ist das sinnvoll?
Nicht gerade elegant, aber einfach:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
IF done THEN
NULL;
ELSE
<do loop stuff>;
END IF;
END LOOP;
END;
In Oracle gibt es eine ähnliche Anweisung EXIT genannt, dass entweder beendet eine Schleife oder eine Funktion / Prozedur (wenn es keine Schleife zu verlassen ist aus). Sie können eine hinzufügen, wenn für einige Zustand zu überprüfen.
Sie könnten das obige Beispiel wie folgt umschreiben:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
EXIT WHEN done;
END LOOP;
END;
Dies ist möglicherweise nicht genug sein, wenn Sie aus der Tiefe einiger verschachtelten Schleifen und Logik verlassen wollen, aber es ist viel klarer als ein paar GOTOs und NULL-Werte.