DECLARE (Snowflake Scripting)¶
Deklariert eine oder mehrere Snowflake Scripting-Variablen, Cursors, RESULTSETs, verschachtelte gespeicherte Prozeduren oder Ausnahmen.
Weitere Informationen dazu finden Sie unter folgenden Themen:
- Siehe auch::
Syntax¶
DECLARE
{ <variable_declaration>
| <cursor_declaration>
| <resultset_declaration>
| <nested_stored_procedure_declaration>
| <exception_declaration> };
[
{ <variable_declaration>
| <cursor_declaration>
| <resultset_declaration>
| <nested_stored_procedure_declaration>
| <exception_declaration> };
...
]
In den folgenden Abschnitten wird die Syntax jedes Deklarationstyps ausführlich beschrieben:
Syntax der Variablendeklaration¶
Verwenden Sie die folgende Syntax, um eine Variable zu deklarieren:
<variable_declaration> ::=
<variable_name> [<type>] [ { DEFAULT | := } <expression>]
Wobei:
variable_nameDer Name der Variablen. Der Name muss den Snowflake-Regeln für Bezeichner folgen (siehe unter Objektbezeichner).
typeDEFAULT expressionoder .:= expressionWeist der Variablen den Wert von
expressionzu. Wenn sowohl der Typtypeals auch der Ausdruckexpressionangegeben sind, muss der Ausdruck einen Datentyp ergeben, der mit dem angegebenentype-Wert übereinstimmt oder implizit in diesen umgewandelt werden kann.
Beispiel:
profit NUMBER(38, 2) := 0;
Ein vollständiges Beispiel finden Sie unter Beispiele.
Weitere Informationen zu Variablen finden Sie unter Verwenden von Variablen.
Syntax der Cursordeklaration¶
Verwenden Sie die folgende Syntax, um einen Cursor zu deklarieren:
<cursor_declaration> ::=
<cursor_name> CURSOR FOR <query>
Wobei:
cursor_nameDer Name, den der Cursor erhalten soll. Dies kann ein beliebiger gültiger Snowflake Bezeichner sein, der in diesem Block noch nicht verwendet wird. Der Bezeichner wird von anderen Cursor-bezogenen Befehlen verwendet, z. B.
FETCH.queryDie Abfrage, die das Resultset definiert, über das der Cursor iteriert.
Dies kann fast jede gültige SELECT-Anweisung sein. Zum Angeben von Bindungsparametern in der SELECT-Anweisung verwenden Sie Fragezeichen (
?). Sie können die Parameter verwenden, um Variablen in der USING-Klausel zu binden, wenn Sie den Cursor öffnen.
Beispiel:
c1 CURSOR FOR SELECT id, price FROM invoices;
Weitere Informationen zu Cursors (einschließlich vollständiger Beispiele) finden Sie unter Verwenden von Cursors.
Syntax der RESULTSET-Deklaration¶
Verwenden Sie die folgende Syntax, um ein RESULTSET zu deklarieren:
<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
Wobei:
resultset_nameDer Name, den das RESULTSET erhalten soll.
Der Name muss innerhalb des aktuellen Sichtbarkeitsbereichs eindeutig sein.
Der Name muss den Snowflake-Regeln für Bezeichner folgen (siehe unter Objektbezeichner).
ASYNCFührt die Abfrage als asynchronen untergeordneten Job aus.
Die Abfrage kann jede gültige SQL-Anweisung sein, einschließlich SELECT-Anweisungen und DML-Anweisungen wie INSERT oder UPDATE.
Wenn dieses Schlüsselwort weggelassen wird, führt die gespeicherte Prozedur die untergeordneten Jobs nacheinander aus und jeder untergeordnete Job wartet, bis der laufende untergeordnete Job beendet ist, bevor er beginnt.
Mit diesem Schlüsselwort können Sie mehrere untergeordnete Jobs gleichzeitig ausführen, was die Effizienz steigern und die Gesamtlaufzeit verkürzen kann.
Sie können AWAIT- und CANCEL-Anweisungen verwenden, um asynchrone untergeordnete Jobs für ein RESULTSET zu verwalten.
DEFAULT queryoder .:= queryWeist dem RESULTSET den Wert von
queryzu.
Beispiel:
res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
Für weitere Informationen zu RESULTSETs (einschließlich vollständiger Beispiele) finden Sie unter Verwenden von RESULTSETs.
Deklarationssyntax für verschachtelte gespeicherte Prozedur¶
Verwenden Sie die folgende Syntax, um eine verschachtelte gespeicherte Prozedur zu deklarieren:
<nested_procedure_name> PROCEDURE (
[ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
AS <nested_procedure_definition>
Wobei:
nested_procedure_nameDer Name der verschachtelten gespeicherten Prozedur. Der Name muss den Snowflake-Regeln für Bezeichner folgen (siehe unter Objektbezeichner).
( [ arg_name arg_data_type ] [ , ... ] )Gibt die Eingabeargumente für die verschachtelte gespeicherte Prozedur an.
Für
arg_name(Name des Arguments) geben Sie den Namen des Eingabearguments an.Für
arg_data_typegeben Sie einen SQL-Datentyp an.
RETURNS { result_data_type | TABLE ( [ col_name col_data_type [ , ... ] ] ) }Gibt den von der gespeicherten Prozedur zurückgegebenen Ergebnistyp an. Derzeit wird NOT NULL im RETURNS-Parameter für verschachtelte gespeicherte Prozeduren nicht unterstützt.
Für
RETURNS result_data_typegeben Sie einen SQL-Datentyp an.Wenn Sie die Snowflake-Datentypen der Spalten in der zurückgegebenen Tabelle kennen, geben Sie in
RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] )die Spaltennamen („col_name“) und Spaltendatentypen („col_data_type“) an.RETURNS TABLE (sales_date DATE, quantity NUMBER)
Andernfalls (z. B. wenn Sie die Spaltentypen während der Laufzeit bestimmen), können Sie die Spaltennamen und -typen weglassen:
RETURNS TABLE ()
Bemerkung
Derzeit können Sie in der
RETURNS TABLE(...)-Klausel den Datentyp GEOGRAPHY als Spaltentyp angeben. Dies gilt unabhängig davon, ob Sie eine gespeicherte oder eine anonyme Prozedur erstellen.CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE(g GEOGRAPHY) ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE(g GEOGRAPHY) ... CALL test_return_geography_table_1();
Wenn Sie versuchen, GEOGRAPHY als Spaltentyp anzugeben, führt der Aufruf der gespeicherten Prozedur zu einem Fehler:
Stored procedure execution error: data type of returned table does not match expected returned table type
Um dieses Problem zu umgehen, können Sie die Spaltenargumente und -typen in
RETURNS TABLE()weglassen.CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE() ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE() ... CALL test_return_geography_table_1();
AS nested_procedure_definitionDefiniert den Code, der von der verschachtelten gespeicherten Prozedur ausgeführt wird. Die Definition kann aus jedem gültigen Code bestehen.
Syntax der Ausnahmedeklaration¶
Verwenden Sie die folgende Syntax, um eine Ausnahme zu deklarieren.
<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
Wobei:
exception_nameDer Name, den die Ausnahme erhalten soll.
exception_numberEine Nummer zur eindeutigen Identifizierung der Ausnahme. Die Zahl muss eine ganze Zahl (Integer) zwischen -20.000 und -20.999 sein. Die Nummer sollte nicht für eine andere Ausnahme verwendet werden, die gleichzeitig verwendet wird.
Standardeinstellung: -20.000
exception_messageEine Meldung zur Beschreibung der Ausnahme. Die Meldung darf keine doppelten Anführungszeichen enthalten.
Standard: leere Zeichenfolge.
Beispiel:
exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
Weitere Informationen zu Ausnahmen (einschließlich vollständiger Beispiele) finden Sie unter Behandeln von Ausnahmen.
Beispiele¶
In diesem Beispiel wird eine Variable namens profit zur Verwendung in einem anonymen Snowflake Scripting-Block deklariert:
DECLARE
profit number(38, 2) DEFAULT 0.0;
BEGIN
LET cost number(38, 2) := 100.0;
LET revenue number(38, 2) DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
Hinweis: Wenn Sie Snowflake CLI, SnowSQL, die Classic Console, oder die Methode execute_stream oder execute_string in Python Connector Code verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in Snowflake CLI, SnowSQL, Classic Console und im Python-Connector):
EXECUTE IMMEDIATE
$$
DECLARE
profit number(38, 2) DEFAULT 0.0;
BEGIN
LET cost number(38, 2) := 100.0;
LET revenue number(38, 2) DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
$$
;
Weitere Beispiele für die Deklaration von Variablen, Cursor, RESULTSETs und Ausnahmen finden Sie in den folgenden Themen: