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;
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 AbschnittBEGIN ... 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
undEND
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;
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;
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;
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;
$$
;
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;
Das Beispiel ergibt die folgende Ausgabe:
+-----------------+ | anonymous block | |-----------------| | 28.274333882 | +-----------------+
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 | +-----------------+
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;+-----------------+ | anonymous block | |-----------------| | Completed | +-----------------+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 | +-----------------+