Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

FOR - SQL-Anweisungen in einer Schleife ausführen

Die FOR-Anweisung führt SQL-Anweisungen in einer Schleife über alle Sätze eines implizit definierten Cursors aus. Cursor-Operationen (z.B. FETCH) werden dabei nicht benötigt. Sie dürfen auch nicht auf den implizit definierten Cursor angewendet werden. Der implizit definierte Cursor wird am Ende der Bearbeitung automatisch geschlossen.

Mit der ITERATE-Anweisung kann sofort zum nächsten Schleifendurchlauf gewechselt werden. Die Schleife kann über eine LEAVE-Anweisung abgebrochen werden.

Die FOR-Anweisung darf nur in einer Routine angegeben werden, d.h. im Rahmen einer CREATE PROCEDURE- oder CREATE FUNCTION-Anweisung. Routinen und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.

Die FOR-Anweisung ist eine nicht-atomare SQL-Anweisung, d.h. in ihr können weitere (atomare oder nicht-atomare) SQL-Anweisungen auftreten.

Wenn die FOR-Anweisung Teil einer COMPOUND-Anweisung ist, dann kann die Schleife bei entsprechenden Fehlerbehandlungsroutinen auch beim Auftreten eines bestimmten SQLSTATE (z.B. keine Daten, Klasse '02xxx') verlassen werden.



[ marke :]

FOR [ forloopname AS] [ cursor CURSOR FOR] abfrageausdruck

   DO routine_sql_anweisung; [ routine_sql_anweisung; ]...

END FOR [ marke ]


forloopname ::= einf_name



marke

Die Marke vor der FOR-Anweisung (Anfangsmarke) bezeichnet den Anfang der Schleife. Sie darf nicht identisch sein mit einer anderen Marke innerhalb der Schleife.

Die Anfangsmarke muss nur dann angegeben werden, wenn mit ITERATE zum nächsten Schleifendurchlauf gewechselt werden soll oder wenn die Schleife über eine LEAVE-Anweisung verlassen werden soll. Sie sollte aber stets verwendet werden, damit SESAM/SQL die korrekte Struktur der Routine überprüfen kann (z.B. bei geschachtelten Schleifen).

Die Marke am Ende der FOR-Anweisung (Endemarke) bezeichnet das Ende der Schleife. Wenn die Endemarke angegeben ist, dann muss auch die Anfangsmarke angegeben sein. Beide Marken müssen identisch sein.


forloopname

Name der FOR-Schleife. Er kann als Qualifikation für die Namen der Spalten der nachfolgenden Cursor-Beschreibung verwendet werden.
forloopname darf max. 31 Zeichen lang sein.


cursor

Optionaler Name für den durch abfrageausdruck definierten Cursor.
Dieser Name muss angegeben werden, wenn für den Cursor die Funktion UPDATE ... WHERE CURRENT OF ... bzw. DELETE ... WHERE CURRENT OF ... verwendet werden soll.


abfrageausdruck

Definition des Cursors, der durch die FOR-Anweisung abgearbeitet werden soll.Der Cursor muss eindeutig benannte Spalten haben. Dies kann durch Verwendung von Korrelationsnamen immer erreicht werden.
Die Datentypen der Ausgabewerte des Cursors dürfen nicht multipel sein. Es können aber einzelne Ausprägungen eines multiplen Feldes verwendet werden.


routine_sql_anweisung

SQL-Anweisung, die in der FOR-Anweisung ausgeführt werden soll.
Eine SQL-Anweisung wird mit „;“ (Semikolon) abgeschlossen.
Mehrere SQL-Anweisungen können nacheinander angegeben werden. Sie werden in der angegebenen Reihenfolge ausgeführt.
Vor der Durchführung einer SQL-Anweisung werden keine Privilegien geprüft.Eine SQL-Anweisung in einer Routine darf auf die Parameter der Routine und (wenn die Anweisung Teil einer COMPOUND-Anweisung ist) auf lokale Variablen, jedoch nicht auf Benutzervariablen zugreifen.

Syntax und Bedeutung von routine_sql_anweisung sind zentral im Abschnitt „SQL-Anweisungen in Routinen" beschrieben. Die dort genannten SQL-Anweisungen dürfen verwendet werden.

Die SQL-Anweisungen update_positioned_anweisung und delete_positioned_anweisung können auch für den entsprechenden Cursor ausgeführt werden, wenn cursor angegeben ist und der abfrageausdruck änderbar ist (siehe Abschnitt „Regeln für änderbare Abfrage-Ausdrücke").

Ausführungshinweise


Die FOR-Anweisung ist eine nicht-atomare Anweisung:

      • Wenn die FOR-Anweisung Teil einer COMPOUND-Anweisung ist, dann gelten die dort beschriebenen Regeln, insbesondere die dort definierten Fehler-Routinen.

      • Wenn die FOR-Anweisung nicht Teil einer COMPOUND-Anweisung ist und eine der SQL-Anweisungen einen SQLSTATE meldet, dann werden ggf. nur die Änderungen dieser Anweisung rückgängig gemacht. Die FOR-Anweisung und die Routine, in der sie enthalten ist, werden abgebrochen. Die SQL-Anweisung, in der die Routine verwendet wurde, liefert den betreffenden SQLSTATE zurück.


Gültigkeitsbereiche bzw. Vorrangregeln für Namen:

      • Bei einfachen Namen (einf_name) wird zunächst ein existierender Routinenparameter oder eine existierende lokale Variable mit diesem Namen verwendet. Andernfalls wird der Name in der aktuellen Anweisung gesucht. Gibt es den Namen auch dort nicht, dann wird der Name (bei geschachtelten FOR-Anweisungen) in den übergeordneten FOR-Anweisungen „von innen nach außen“ gesucht.

      • Es wird empfohlen, einen Namen für die FOR-Schleife (forloopname) zu definieren, siehe unten. Damit werden Namensbezüge innerhalb von FOR-Schleifen deutlich gemacht. Vorrangregeln müssen dann nicht beachtet werden.


Name für eine FOR-Schleife:

In den SQL-Anweisungen der FOR-Anweisung kann über die Spaltennamen der Cursor-Beschreibung auf die aktuellen Werte Bezug genommen werden.

Deutlicher ist es aber, einen Namen für die FOR-Schleife (forloopname) zu definieren.
Dieser Name kann zur Qualifikation für die Spalten des aktuellen Satzes verwendet werden:

FOR F1 AS SELECT C001, C002 FROM T1 WHERE P < 127 
DO
   UPDATE TU
   SET COLX = COLX + F1.C001 WHERE COLY = F1.C002;
END FOR

Anschaulich wird dies in einer geschachtelten FOR-Anweisung:

FOR F1 AS SELECT C001 FROM T1 WHERE P < 127
DO
    FOR F2 AS SELECT C001, C002 FROM T2 WHERE Q < 875
    DO
        UPDATE TU
               SET COLX = COLX + F1.C001 + F2.C001
               WHERE COLY < F2.C002;
    END FOR;
END FOR

Siehe auch

CREATE PROCEDURE, CREATE FUNCTION, ITERATE, LEAVE