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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top