Erläuterungen zu Blöcken in Snowflake Scripting

In Snowflake Scripting schreiben Sie prozeduralen Code innerhalb eines Snowflake Scripting-Blocks. Unter diesem Thema wird erklärt, wie Sie prozeduralen Code in einem Block schreiben.

Unter diesem Thema:

Erläuterungen zur Struktur eines Blocks

Ein Block hat die folgende Grundstruktur:

DECLARE
  ... (variable declarations, cursor declarations, etc.) ...
BEGIN
  ... (Snowflake Scripting and SQL statements) ...
EXCEPTION
  ... (statements for handling exceptions) ...
END;
Copy

Ein Block besteht aus Abschnitten (einige davon optional), die durch Schlüsselwörter abgegrenzt sind. Jeder Abschnitt dient einem anderen Zweck:

  • DECLARE: Wenn Sie im Block Variablen, Cursors usw. verwenden müssen, können Sie diese entweder im Abschnitt DECLARE des Blocks oder im Abschnitt BEGIN ... END des Blocks deklarieren.

    Sie können Folgendes deklarieren:

    Dieser Abschnitt des Blocks ist optional.

  • BEGIN … END: Schreiben Sie in den Abschnitt des Blocks zwischen BEGIN und END die SQL-Anweisungen und die Snowflake Scripting-Konstrukte.

  • EXCEPTION: Wenn Sie Code zur Behandlung von Ausnahmen hinzufügen müssen, fügen Sie diesen in den Abschnitt EXCEPTION des Blocks ein.

    Dieser Abschnitt des Blocks ist optional.

Ein einfacher Block benötigt nur die Schlüsselwörter BEGIN und END. Beispiel:

BEGIN
    CREATE TABLE employee (id INTEGER, ...);
    CREATE TABLE dependents (id INTEGER, ...);
END;
Copy

Wichtig

Das Schlüsselwort BEGIN, mit dem ein Block gestartet wird, unterscheidet sich von dem Schlüsselwort BEGIN, mit dem eine Transaktion gestartet wird. Um Verwirrung zu vermeiden, empfiehlt Snowflake dringend, Transaktionen mit BEGIN TRANSACTION (oder der älteren Form BEGIN WORK) zu beginnen und nicht nur mit BEGIN.

Alle Datenbankobjekte, die Sie in einem Block erstellen (z. B. die Tabellen im obigen Beispiel), können außerhalb des Blocks verwendet werden.

Wenn der Code Variablen verwendet, können Sie diese Variablen im Block deklarieren. Eine Möglichkeit, dies zu tun, ist im DECLARE-Abschnitt des Blocks. Beispiel:

DECLARE
    radius_of_circle FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius_of_circle := 3;
    area_of_circle := pi() * radius_of_circle * radius_of_circle;
    RETURN area_of_circle;
END;
Copy

In diesem Beispiel wird eine Variable deklariert, diese Variable verwendet und der Wert dieser Variablen zurückgegeben. (Einzelheiten dazu, wie Werte aus einem Block zurückgegeben werden, finden Sie unter Zurückgeben eines Wertes).

Beachten Sie, dass diese Variablen nicht außerhalb des Blocks verwendet werden können. Siehe Erläuterungen zur Sichtbarkeit von Deklarationen.

Sie können auch eine Variable im Abschnitt BEGIN ... END des Blocks deklarieren, indem Sie LET verwenden. Weitere Details dazu finden Sie unter Deklarieren einer Variablen.

Verwenden eines Blocks in einer gespeicherten Prozedur

Sie können einen Block in der Definition einer gespeicherten Prozedur verwenden. Im Folgenden finden Sie ein Beispiel, das Sie in Snowsight ausführen können. Dabei wird eine gespeicherte Prozedur erstellt, die einen Snowflake Scripting-Block enthält:

CREATE OR REPLACE PROCEDURE area()
  RETURNS FLOAT
  LANGUAGE SQL
  AS
    DECLARE
      radius FLOAT;
      area_of_circle FLOAT;
    BEGIN
      radius := 3;
      area_of_circle := PI() * radius * radius;
      RETURN area_of_circle;
    END;
Copy

Beachten Sie, dass Sie bei Verwendung von SnowSQL oder der klassischen Weboberfläche einfache Anführungszeichen oder doppelte Dollarzeichen zur Abgrenzung des Blocks verwenden müssen, wie unter Verwenden von Snowflake Scripting in SnowSQL und über die klassische Weboberfläche erläutert:

CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
$$
DECLARE
    radius FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius := 3;
    area_of_circle := PI() * radius * radius;
    RETURN area_of_circle;
END;
$$
;
Copy

Verwenden eines anonymen Blocks

Wenn Sie den Block nicht in einer gespeicherten Prozedur in der Datenbank speichern möchten, können Sie einen anonymen Block definieren und verwenden. Ein anonymer Block ist ein Block, der nicht Teil einer gespeicherten Prozedur ist. Sie definieren den Block als eine separate, eigenständige SQL-Anweisung.

Mit der Anweisung BEGIN wird der Block sowohl definiert als auch ausgeführt. (Die Ausführung des Blocks erfolgt nicht mit einem separaten CALL-Befehl.)

Im Folgenden finden Sie ein Beispiel für einen anonymen Block, den Sie in Snowsight ausführen können:

DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := PI() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
Copy

Das Beispiel ergibt die folgende Ausgabe:

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

Beachten Sie, dass Sie bei Verwendung von SnowSQL oder der klassischen Weboberfläche den Block als Zeichenfolgenliteral (begrenzt durch einfache Anführungszeichen oder doppelte Dollarzeichen) angeben und an den Befehl EXECUTE IMMEDIATE übergeben müssen, wie unter Verwenden von Snowflake Scripting in SnowSQL und über die klassische Weboberfläche erläutert:

EXECUTE IMMEDIATE $$
DECLARE
    radius_of_circle FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius_of_circle := 3;
    area_of_circle := PI() * radius_of_circle * radius_of_circle;
    RETURN area_of_circle;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

Beachten Sie, dass die Spaltenüberschrift in der Ausgabe „anonymous block“ lautet. Wäre der Code in einer gespeicherten Prozedur ausgeführt worden, wäre die Spaltenüberschrift der Name der gespeicherten Prozedur gewesen.

Im folgenden Beispiel wird ein anonymer Block definiert, der zwei Tabellen erstellt, die miteinander in Beziehung stehen. In diesem Beispiel benötigt der Block mit dem prozeduralen Code keine Variablen, daher wird der Abschnitt DECLARE des Blocks weggelassen.

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy

Hinweis: Wenn Sie SnowSQL oder die klassische Weboberfläche verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL und über die klassische Weboberfläche):

EXECUTE IMMEDIATE $$
BEGIN
    CREATE TABLE parent (ID INTEGER);
    CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
    RETURN 'Completed';
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy