FOR (Snowflake Scripting)¶
Eine FOR
-Schleife wiederholt eine Sequenz von Schritten mit einer bestimmten Häufigkeit. Die Anzahl der Wiederholungen kann vom Benutzer angegeben werden oder durch die Anzahl der Zeilen in einem Cursor bestimmt sein. Die Syntax dieser beiden Typen von FOR
-Schleifen ist leicht unterschiedlich.
Weitere Informationen zu Schleifen finden Sie unter Verwenden von Schleifen.
Bemerkung
Dieses Snowflake Scripting-Konstrukt ist nur innerhalb eines Snowflake Scripting-Blocks gültig.
Syntax¶
Um eine Schleife über alle Zeilen in einem Cursor auszuführen, verwenden Sie Folgendes:
FOR <row_variable> IN <cursor_name> DO statement; [ statement; ... ] END FOR [ <label> ] ;
Um eine bestimmte Anzahl von Schleifen auszuführen, verwenden Sie Folgendes:
FOR <counter_variable> IN [ REVERSE ] <start> TO <end> { DO | LOOP } statement; [ statement; ... ] END { FOR | LOOP } [ <label> ] ;
Wobei:
row_variable
Geben Sie einen Variablennamen an, der den Regeln für Objektbezeichner entspricht.
Fügen Sie keine Deklaration dieser Variable zum Abschnitt DECLARE oder BEGIN … END hinzu. Der Name darf im Sichtbarkeitsbereich des lokalen Blocks noch nicht definiert sein.
Der Name ist innerhalb der
FOR
-Schleife gültig, aber nicht außerhalb derFOR
-Schleife.Die Variable
row_variable
enthält eine Zeile des Cursors. Der Zugriff auf die Felder dieser Zeile erfolgt in punktierter Schreibweise. Beispiel:
my_row_variable.my_column_name
Ein ausführlicheres Beispiel finden Sie in den folgenden Beispielen.
counter_variable
Geben Sie einen Variablennamen an, der den Regeln für Objektbezeichner entspricht.
Der Name der
counter_variable
ist nur innerhalb derFOR
-Schleife gültig. Wenn eine Variable mit demselben Namen außerhalb der Schleife deklariert wird, sind die äußere Variable und die Schleifenvariable getrennt. Innerhalb der Schleife werden die Verweise auf diesen Namen in der Schleifenvariable aufgelöst.Der Code innerhalb der
FOR
-Schleife darf den Wert der Zählervariablen lesen, ihn aber nicht verändern. Erhöhen Sie zum Beispiel die Zählervariable nicht manuell, um die Schrittweite zu ändern.start
Dies ist der Anfangswert von
counter_variable
.Der Startwert muss ein INTEGER-Wert oder ein Ausdruck sein, der einen INTEGER-Wert ergibt.
end
Dies ist der Endwert von
counter_variable
, nachdemcounter_variable
in der Schleife erhöht wurde.Der Endwert muss ein INTEGER-Wert oder ein Ausdruck sein, der einen INTEGER-Wert ergibt.
Der Endwert
end
muss größer oder gleich dem Startwertstart
sein. Wennend
kleiner ist alsstart
, wird die Schleife 0 Mal ausgeführt (auch wenn das SchlüsselwortREVERSE
verwendet wird).
statement
Folgende Typen von Anweisungen sind möglich:
Eine einzelne SQL-Anweisung (einschließlich CALL)
Eine Ablaufsteuerungsanweisung (z. B. Schleife oder Verzweigung)
Ein verschachtelter Block
cursor_name
Der Name des Cursors, der durchlaufen werden soll.
label
Ein optionales Label. Ein solches Label kann ein Sprungziel für eine BREAK (Snowflake Scripting)- oder CONTINUE (Snowflake Scripting)-Anweisung sein. Der Name muss den Regeln für Bezeichner folgen (siehe unter Objektbezeichner).
Nutzungshinweise¶
Die Schleife iteriert bis einschließlich zum
end
-Punkt.Beispiel:
FOR i IN 1 TO 10
durchläuft eine Schleife 10 Mal, und während der letzten Iteration ist der Wert voni
10.Wenn Sie das Schlüsselwort
REVERSE
verwenden, iteriert die Schleife rückwärts bis einschließlich desstart
-Werts.Eine Schleife kann mehrere Anweisungen enthalten. Sie können, müssen aber nicht, einen BEGIN … END (Snowflake Scripting)-Block verwenden, um diese Anweisungen aufzunehmen.
Das optionale Schlüsselwort
REVERSE
bewirkt, dass Snowflake mit dem Endwertend
beginnt und bis zum Startwertstart
herunterzählt.Obwohl Sie den Wert der
counter_variable
innerhalb der Schleife ändern können, empfiehlt Snowflake, dies zu vermeiden. Die Änderung des Werts vermindert die Verständlichkeit des Codes.Wenn Sie das Schlüsselwort
DO
verwenden, dann verwenden Sie am Ende derFOR
-SchleifeEND FOR
. Wenn Sie das SchlüsselwortLOOP
verwenden, dann verwenden Sie am Ende derFOR
-SchleifeEND LOOP
.
Beispiele¶
- Cursorbasierte FOR-Schleifen:
Dieses Beispiel zeigt, wie ein Cursor verwendet wird, um die Werte in der Spalte price
für alle Zeilen zu summieren, die von einer Abfrage zurückgegeben werden. Diese gespeicherte Prozedur verhält sich ähnlich wie eine Aggregatfunktion.
CREATE or replace TABLE invoices (price NUMBER(12, 2)); INSERT INTO invoices (price) VALUES (11.11), (22.22);CREATE OR REPLACE PROCEDURE for_loop_over_cursor() RETURNS FLOAT LANGUAGE SQL AS $$ DECLARE total_price FLOAT; c1 CURSOR FOR SELECT price FROM invoices; BEGIN total_price := 0.0; OPEN c1; FOR rec IN c1 DO total_price := total_price + rec.price; END FOR; CLOSE c1; RETURN total_price; END; $$ ;Die gespeicherten Prozedur liefert folgende Ausgabe:
CALL for_loop_over_cursor(); +----------------------+ | FOR_LOOP_OVER_CURSOR | |----------------------| | 33.33 | +----------------------+
- Zählerbasierte FOR-Schleifen:
Dieses Beispiel zeigt, wie eine FOR
-Schleife verwendet wird, um eine bestimmte Anzahl von Wiederholungen auszuführen:
CREATE PROCEDURE simple_for(iteration_limit INTEGER) RETURNS INTEGER LANGUAGE SQL AS $$ DECLARE counter INTEGER DEFAULT 0; BEGIN FOR i IN 1 TO iteration_limit DO counter := counter + 1; END FOR; RETURN counter; END; $$;Die gespeicherten Prozedur liefert folgende Ausgabe:
CALL simple_for(3); +------------+ | SIMPLE_FOR | |------------| | 3 | +------------+
Im folgenden Beispiel wird die Verwendung des Schlüsselworts REVERSE
zum Rückwärtszählen gezeigt.
CREATE PROCEDURE reverse_loop(iteration_limit INTEGER) RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE values_of_i VARCHAR DEFAULT ''; BEGIN FOR i IN REVERSE 1 TO iteration_limit DO values_of_i := values_of_i || ' ' || i::varchar; END FOR; RETURN values_of_i; END; $$;Die gespeicherten Prozedur liefert folgende Ausgabe:
CALL reverse_loop(3); +--------------+ | REVERSE_LOOP | |--------------| | 3 2 1 | +--------------+
Im folgenden Beispiel wird das Verhalten aufgezeigt, wenn die Schleifenzählervariable denselben Namen (i
) hat wie eine bereits deklarierte Variable. Innerhalb der FOR
-Schleife werden Verweise auf i
auf die Schleifenzählervariable aufgelöst (nicht auf die außerhalb der Schleife deklarierte Variable).
CREATE PROCEDURE p(iteration_limit INTEGER) RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE counter INTEGER DEFAULT 0; i INTEGER DEFAULT -999; return_value VARCHAR DEFAULT ''; BEGIN FOR i IN 1 TO iteration_limit DO counter := counter + 1; END FOR; return_value := 'counter: ' || counter::varchar || '\n'; return_value := return_value || 'i: ' || i::VARCHAR; RETURN return_value; END; $$;Die gespeicherten Prozedur liefert folgende Ausgabe:
CALL p(3); +------------+ | P | |------------| | counter: 3 | | i: -999 | +------------+