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.

Siehe auch:

BREAK, CONTINUE

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> ] ;
Copy

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> ] ;
Copy

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 der FOR-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 der FOR-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, nachdem counter_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 Startwert start sein. Wenn end kleiner ist als start, wird die Schleife 0 Mal ausgeführt (auch wenn das Schlüsselwort REVERSE 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 von i 10.

    Wenn Sie das Schlüsselwort REVERSE verwenden, iteriert die Schleife rückwärts bis einschließlich des start-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 Endwert end beginnt und bis zum Startwert start 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 der FOR-Schleife END FOR. Wenn Sie das Schlüsselwort LOOP verwenden, dann verwenden Sie am Ende der FOR-Schleife END 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);
Copy
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;
$$
;
Copy

Die gespeicherten Prozedur liefert folgende Ausgabe:

CALL for_loop_over_cursor();
+----------------------+
| FOR_LOOP_OVER_CURSOR |
|----------------------|
|                33.33 |
+----------------------+
Copy
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;
$$;
Copy

Die gespeicherten Prozedur liefert folgende Ausgabe:

CALL simple_for(3);
+------------+
| SIMPLE_FOR |
|------------|
|          3 |
+------------+
Copy

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;
$$;
Copy

Die gespeicherten Prozedur liefert folgende Ausgabe:

CALL reverse_loop(3);
+--------------+
| REVERSE_LOOP |
|--------------|
|  3 2 1       |
+--------------+
Copy

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;
$$;
Copy

Die gespeicherten Prozedur liefert folgende Ausgabe:

CALL p(3);
+------------+
| P          |
|------------|
| counter: 3 |
| i: -999    |
+------------+
Copy