CREATE PROCEDURE¶
Erstellt eine neue gespeicherte Prozedur.
Eine Prozedur kann in einer der folgenden Sprachen geschrieben werden:
Bemerkung
Wenn Sie eine anonyme (und nicht gespeicherte) Prozedur erstellen und aufrufen möchten, verwenden Sie CALL (mit anonymer Prozedur). Das Erstellen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.
Darüber hinaus unterstützt dieser Befehl die folgenden Varianten:
CREATE OR ALTER PROCEDURE: Erstellt eine neue Prozedur, wenn sie nicht existiert, oder ändert eine bestehende Prozedur.
- Siehe auch:
ALTER PROCEDURE, DROP PROCEDURE, SHOW PROCEDURES, DESCRIBE PROCEDURE, CALL
Syntax¶
Java-Handler¶
Sie können eine gespeicherte Prozedur erstellen, die entweder ihren Handler-Code inline enthält oder auf ihren Handler-Code in einer JAR-Datei verweist. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Beispiele für gespeicherte Prozeduren in Java finden Sie unter Java-Handler für mit SQL erstellten gespeicherte Prozeduren schreiben.
Für inline gespeicherte Prozeduren verwenden Sie die folgende Syntax:
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE JAVA
RUNTIME_VERSION = '<java_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
AS '<procedure_definition>'
Für eine gespeicherte Prozedur, die einen vorkompilierten Handler verwendet, verwenden Sie die folgende Syntax.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE JAVA
RUNTIME_VERSION = '<java_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
JavaScript-Handler¶
Beispiele für gespeicherte Prozeduren in JavaScript finden Sie unter Schreiben von gespeicherten Prozeduren in JavaScript.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS <result_data_type> [ NOT NULL ]
LANGUAGE JAVASCRIPT
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
AS '<procedure_definition>'
Wichtig
Bei JavaScript muss die Groß-/Kleinschreibung beachtet werden, bei SQL nicht. Wichtige Informationen zur Verwendung von Argumentnamen für gespeicherte Prozeduren im JavaScript-Code finden Sie unter Groß-/Kleinschreibung in JavaScript-Argumenten.
Python-Handler¶
Beispiele für gespeicherte Prozeduren in Python finden Sie unter Schreiben von gespeicherten Prozeduren mit SQL und Python.
Für inline gespeicherte Prozeduren verwenden Sie die folgende Syntax:
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE PYTHON
RUNTIME_VERSION = '<python_version>'
PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }]
AS '<procedure_definition>'
Für eine gespeicherte Prozedur, bei der sich der Code in einer Datei in einem Stagingbereich befindet, verwenden Sie die folgende Syntax:
CREATE [ OR REPLACE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE PYTHON
RUNTIME_VERSION = '<python_version>'
PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<module_file_name>.<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
Scala-Handler¶
Sie können eine gespeicherte Prozedur erstellen, die entweder ihren Handler-Code inline enthält oder auf ihren Handler-Code in einer JAR-Datei verweist. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Beispiele für gespeicherte Prozeduren in Scala finden Sie unter Schreiben von Scala-Handlern für mit SQL erstellte gespeicherte Prozeduren.
Für inline gespeicherte Prozeduren verwenden Sie die folgende Syntax:
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE SCALA
RUNTIME_VERSION = '<scala_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
AS '<procedure_definition>'
Für eine gespeicherte Prozedur, die einen vorkompilierten Handler verwendet, verwenden Sie die folgende Syntax.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE SCALA
RUNTIME_VERSION = '<scala_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
Snowflake Scripting-Handler¶
Beispiele für gespeicherte Prozeduren in Snowflake Scripting finden Sie unter Schreiben von gespeicherten Prozeduren in Snowflake Scripting.
CREATE [ OR REPLACE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
[ NOT NULL ]
LANGUAGE SQL
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } ]
AS <procedure_definition>
Bemerkung
Wenn Sie eine Snowflake Scripting-Prozedur in SnowSQL oder der klassischen Weboberfläche erstellen, müssen Sie Trennzeichen für Zeichenfolgenliterale ('
oder $$
) um die Prozedurdefinition in procedure definition
setzen. Siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor.
Syntaxvariante¶
CREATE OR ALTER PROCEDURE¶
Erstellt eine neue Prozedur, wenn sie noch nicht existiert, oder wandelt eine bestehende Prozedur in die in der Anweisung definierte Prozedur um. Eine CREATE OR ALTER PROCEDURE-Anweisung folgt den Syntaxregeln einer CREATE PROCEDURE-Anweisung und hat die gleichen Einschränkungen wie eine ALTER PROCEDURE-Anweisung.
Änderungen an den folgenden Punkten werden unterstützt:
LOG_LEVEL, TRACE_LEVEL, COMMENT, SECURE
SECRETS und EXTERNAL_ACCESS_INTEGRATIONS für Python, Scala und Java Stored Procs
Ausführungsberechtigungen (EXECUTE AS CALLER oder EXECUTE AS OWNER)
Weitere Informationen dazu finden Sie unter Nutzungshinweise zu CREATE OR ALTER PROCEDURE.
CREATE [ OR ALTER ] PROCEDURE ...
Erforderliche Parameter¶
Alle Sprachen¶
name ( [ arg_name arg_data_type [ DEFAULT default_value ] ] [ , ... ] )
Gibt den Bezeichner (
name
), alle Eingabeargumente und die Standardwerte aller optionalen Argumente der gespeicherten Prozedur an.Für den Bezeichner:
Der Bezeichner muss für das Schema, in dem die gespeicherte Prozedur erstellt wird, nicht eindeutig sein, da gespeicherte Prozeduren durch die Kombination aus Name und Argumenttypen identifiziert und aufgelöst werden.
Der Bezeichner muss mit einem alphabetischen Zeichen beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B. „Mein Objekt“). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten. Siehe Anforderungen an Bezeichner.
Für die Eingabeargumente:
Für
arg_name
(Name des Arguments) geben Sie den Namen des Eingabearguments an.Für
arg_data_type
(Datentyp des Arguments) ist der Snowflake-Datentyp zu verwenden, der der von Ihnen verwendeten Sprache entspricht.Für gespeicherte Prozeduren in Java siehe Zuordnung von Datentypen zwischen SQL und Java.
Für gespeicherte Prozeduren in JavaScript siehe Zuordnen von SQL- und JavaScript-Datentypen.
Für gespeicherte Prozeduren in Python siehe Zuordnung von Datentypen zwischen SQL und Python.
Für gespeicherte Prozeduren in Scala siehe Zuordnung von Datentypen zwischen SQL und Scala.
Für Snowflake Scripting ein SQL-Datentyp.
Bemerkung
Bei gespeicherten Prozeduren, die Sie in Java, Python oder Scala (unter Verwendung der Snowpark-APIs) schreiben, lassen Sie das Argument für das Snowpark-
Session
-Objekt weg.Das Argument
Session
ist kein formaler Parameter, den Sie in CREATE PROCEDURE oder CALL angeben. Wenn Sie Ihre gespeicherte Prozedur aufrufen, erstellt Snowflake automatisch einSession
-Objekt und übergibt es an die Handler-Funktion für Ihre gespeicherte Prozedur.Um anzuzeigen, dass ein Argument optional ist, verwenden Sie
DEFAULT default_value
unter Angabe des Standardwerts. Für den Standardwert können Sie ein Literal oder einen Ausdruck verwenden.Wenn Sie optionale Argumente angeben, müssen Sie diese nach den erforderlichen Argumenten positionieren.
Wenn eine Prozedur optionale Argumente hat, können Sie keine weiteren Prozeduren mit demselben Namen und unterschiedlichen Signaturen definieren.
Weitere Details dazu finden Sie unter Optionale Argumente angeben.
RETURNS result_data_type [ NOT NULL ]
Gibt den von der gespeicherten Prozedur zurückgegebenen Ergebnistyp an.
Verwenden Sie für
result_data_type
(Ergebnisdatentyp) den Snowflake-Datentyp, der dem Typ der von Ihnen verwendeten Sprache entspricht.Für gespeicherte Prozeduren in Java siehe Zuordnung von Datentypen zwischen SQL und Java.
Für gespeicherte Prozeduren in JavaScript siehe Zuordnen von SQL- und JavaScript-Datentypen.
Für gespeicherte Prozeduren in Python siehe Zuordnung von Datentypen zwischen SQL und Python.
Für gespeicherte Prozeduren in Scala siehe Zuordnung von Datentypen zwischen SQL und Scala.
Für Snowflake Scripting ein SQL-Datentyp.
Bemerkung
Gespeicherte Prozeduren, die Sie in Snowpark (Java oder Scala) schreiben, müssen einen Rückgabewert haben. Wenn eine gespeicherte Prozedur in Snowpark (Python) keinen Wert zurückgibt, wird dies als Rückgabe von
None
verarbeitet. Beachten Sie, dass jede CREATE PROCEDURE-Anweisung eine RETURNS-Klausel enthalten muss, die einen Rückgabetyp definiert, auch wenn die Prozedur nicht explizit etwas zurückgibt.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.CREATE OR REPLACE PROCEDURE get_top_sales() 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:
CREATE OR REPLACE PROCEDURE get_top_sales() 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();
RETURNS TABLE(…) wird nur unterstützt, wenn der Handler in den folgenden Sprachen geschrieben ist:
In der Praxis kann der zurückgegebene Wert nicht außerhalb eines Snowflake Scripting-Blocks verwendet werden, da der Aufruf nicht Teil eines Ausdrucks sein kann.
LANGUAGE language
Gibt an, in welcher Sprache der Code der gespeicherten Prozedur geschrieben ist. Beachten Sie, dass dies für gespeicherte Prozeduren, die mit Snowflake Scripting geschrieben wurden, optional ist.
Derzeit werden folgende Werte für
language
(Sprache) unterstützt:JAVA
(für Java)JAVASCRIPT
(für JavaScript)PYTHON
(für Python)SCALA
(für Scala)SQL
(für Snowflake Scripting)
Standard:
SQL
.AS procedure_definition
Definiert den Code, der von der gespeicherten Prozedur ausgeführt wird. Die Definition kann aus jedem gültigen Code bestehen.
Beachten Sie Folgendes:
Bei gespeicherten Prozeduren, für die der Code nicht inline ist, lassen Sie die AS-Klausel weg. Dazu gehören gespeicherte Prozeduren mit Staging-Handlern.
Verwenden Sie stattdessen die IMPORTS-Klausel, um den Speicherort der Datei anzugeben, die den Code der gespeicherten Prozedur enthält. Weitere Details dazu finden Sie unter:
Java-Handler für mit SQL erstellten gespeicherte Prozeduren schreiben
Schreiben von Scala-Handlern für mit SQL erstellte gespeicherte Prozeduren
Weitere Informationen zu Inline- und Staging-Handlern finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
In folgenden Fällen müssen Sie Trennzeichen für Zeichenfolgenliterale (
'
oder$$
) um die Prozedurdefinition inprocedure definition
setzen:Sie verwenden eine andere Sprache als Snowflake Scripting.
Sie erstellen eine Snowflake Scripting-Prozedur in SnowSQL oder der klassischen Weboberfläche. Siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor.
Wenn Sie Ihre gespeicherte Prozedur in JavaScript schreiben und eine Zeichenfolge Zeilenumbrüche enthält, können Sie um die Zeichenfolge herum Backquotes (auch „Backticks“ genannt) verwenden.
Im folgenden Beispiel einer gespeicherten JavaScript-Prozedur werden
$$
und Backquotes verwendet, da der Text der gespeicherten Prozedur einfache und doppelte Anführungszeichen enthält:CREATE OR REPLACE TABLE table1 ("column 1" VARCHAR);
CREATE or replace PROCEDURE proc3() RETURNS VARCHAR LANGUAGE javascript AS $$ var rs = snowflake.execute( { sqlText: `INSERT INTO table1 ("column 1") SELECT 'value 1' AS "column 1" ;` } ); return 'Done.'; $$;
Snowflake validiert den Code nicht vollständig, wenn Sie den Befehl CREATE PROCEDURE ausführen.
Bei gespeicherten Snowpark (Scala)-Prozeduren werden beispielsweise die Anzahl und der Typ der Eingabeargumente überprüft, aber der Textteil der Funktion wird nicht validiert. Wenn die Zahl oder die Typen nicht übereinstimmen (z. B. wenn der Snowflake-Datentyp NUMBER verwendet wird, während das Argument ein nicht-numerischer Typ ist), führt die Ausführung des Befehls CREATE PROCEDURE zu einem Fehler.
Wenn der Code nicht gültig ist, wird der CREATE PROCEDURE-Befehl erfolgreich sein, und bei Aufruf der gespeicherten Prozedur werden Fehler zurückgegeben.
Weitere Informationen zu gespeicherten Prozeduren finden Sie unter Verwenden von gespeicherten Prozeduren.
Java¶
RUNTIME_VERSION = 'language_runtime_version'
Die zu verwendende Laufzeitversion der Programmiersprache. Folgende Versionen werden derzeit unterstützt:
11
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Eine durch Komma getrennte Liste mit den Namen der in Snowflake bereitgestellten Pakete, die in die Ausführungsumgebung des Handler-Codes aufgenommen werden sollen. Das Snowpark-Paket ist für gespeicherte Prozeduren erforderlich, daher muss es immer in der PACKAGES-Klausel referenziert werden. Weitere Informationen zu Snowpark finden Sie unter Snowpark API.
Standardmäßig enthält die Umgebung, in der Snowflake gespeicherte Prozeduren ausführt, einen ausgewählten Satz von Paketen für unterstützte Sprachen. Wenn Sie in der PACKAGES-Klausel auf diese Pakete verweisen, ist es nicht erforderlich, in der IMPORTS-Klausel auf eine Datei zu verweisen, die das Paket enthält, da das Paket bereits in Snowflake verfügbar ist. Sie können auch die Paketversion angeben.
Eine Liste der unterstützten Pakete und Versionen für Java erhalten Sie, indem Sie die INFORMATION_SCHEMA.PACKAGES-Ansicht nach Zeilen abfragen, in denen die Sprache angegeben ist. Beispiel:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'java';
Geben Sie den Paketnamen und die Versionsnummer im folgenden Format an:
domain:package_name:version
Für die neueste Version geben Sie
latest
fürversion
an.Um beispielsweise ein Paket aus der neuesten Snowpark-Bibliothek in Snowflake einzubinden, verwenden Sie Folgendes:
PACKAGES = ('com.snowflake:snowpark:latest')
Wenn Sie ein Paket aus der Snowpark-Bibliothek angeben, müssen Sie Version 1.3.0 oder höher angeben.
HANDLER = 'fully_qualified_method_name'
Verwenden Sie den vollqualifizierten Namen der Methode oder Funktion der gespeicherten Prozedur. Dies geschieht typischerweise in der folgenden Form:
com.my_company.my_package.MyClass.myMethod
Wobei:
com.my_company.my_package
entspricht dem Paket, das das Objekt oder die Klasse enthält:
package com.my_company.my_package;
Python¶
RUNTIME_VERSION = 'language_runtime_version'
Die zu verwendende Laufzeitversion der Programmiersprache. Folgende Versionen werden derzeit unterstützt:
3.9
3.10
3.11
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Eine durch Komma getrennte Liste mit den Namen der in Snowflake bereitgestellten Pakete, die in die Ausführungsumgebung des Handler-Codes aufgenommen werden sollen. Das Snowpark-Paket ist für gespeicherte Prozeduren erforderlich, daher muss es immer in der PACKAGES-Klausel referenziert werden. Weitere Informationen zu Snowpark finden Sie unter Snowpark API.
Standardmäßig enthält die Umgebung, in der Snowflake gespeicherte Prozeduren ausführt, einen ausgewählten Satz von Paketen für unterstützte Sprachen. Wenn Sie in der PACKAGES-Klausel auf diese Pakete verweisen, ist es nicht erforderlich, in der IMPORTS-Klausel auf eine Datei zu verweisen, die das Paket enthält, da das Paket bereits in Snowflake verfügbar ist. Sie können auch die Paketversion angeben.
Eine Liste der unterstützten Pakete und Versionen für Python erhalten Sie, indem Sie die INFORMATION_SCHEMA.PACKAGES-Ansicht nach Zeilen abfragen, in denen die Sprache angegeben ist. Beispiel:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'python';
Snowflake enthält eine große Anzahl von Paketen, die über Anaconda verfügbar sind. Weitere Informationen dazu finden Sie unter Verwenden von Drittanbieter-Paketen.
Geben Sie den Paketnamen und die Versionsnummer im folgenden Format an:
package_name[==version]
Um die neueste Version anzugeben, lassen Sie die Versionsnummer weg.
Um beispielsweise Version 2.3.5 des spacy-Pakets (zusammen mit der neuesten Version des erforderlichen Snowpark-Pakets) einzubinden, verwenden Sie Folgendes:
PACKAGES = ('snowflake-snowpark-python', 'spacy==2.3.5')
Wenn Sie ein Paket aus der Snowpark-Bibliothek angeben, müssen Sie Version 0.4.0 oder höher angeben. Lassen Sie die Versionsnummer weg, um die neueste in Snowflake verfügbare Version zu verwenden.
HANDLER = 'fully_qualified_method_name'
Verwenden Sie den Namen der Funktion oder Methode der gespeicherten Prozedur. Dies kann unterschiedlich sein, je nachdem, ob der Code inline ist oder er in einem Stagingbereich referenziert wird.
Wenn der Code inline ist, können Sie nur den Funktionsnamen angeben, wie im folgenden Beispiel:
CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT) ... HANDLER = 'run' AS $$ def run(session, from_table, to_table, count): ... $$;
Wenn der Code aus einem Stagingbereich importiert wird, geben Sie den vollqualifizierten Namen der Handlerfunktion als
<Name_des_Moduls>.<Name_der_Funktion>
an.CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT) ... IMPORTS = ('@mystage/my_py_file.py') HANDLER = 'my_py_file.run';
Scala¶
RUNTIME_VERSION = 'language_runtime_version'
Die zu verwendende Laufzeitversion der Programmiersprache. Folgende Versionen werden derzeit unterstützt:
2.12
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Eine durch Komma getrennte Liste mit den Namen der in Snowflake bereitgestellten Pakete, die in die Ausführungsumgebung des Handler-Codes aufgenommen werden sollen. Das Snowpark-Paket ist für gespeicherte Prozeduren erforderlich, daher muss es immer in der PACKAGES-Klausel referenziert werden. Weitere Informationen zu Snowpark finden Sie unter Snowpark API.
Standardmäßig enthält die Umgebung, in der Snowflake gespeicherte Prozeduren ausführt, einen ausgewählten Satz von Paketen für unterstützte Sprachen. Wenn Sie in der PACKAGES-Klausel auf diese Pakete verweisen, ist es nicht erforderlich, in der IMPORTS-Klausel auf eine Datei zu verweisen, die das Paket enthält, da das Paket bereits in Snowflake verfügbar ist. Sie können auch die Paketversion angeben.
Eine Liste der unterstützten Pakete und Versionen für Scala erhalten Sie, indem Sie die INFORMATION_SCHEMA.PACKAGES-Ansicht nach Zeilen abfragen, in denen die Sprache angegeben ist. Beispiel:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'scala';
Geben Sie den Paketnamen und die Versionsnummer im folgenden Format an:
domain:package_name:version
Für die neueste Version geben Sie
latest
fürversion
an.Um beispielsweise ein Paket aus der neuesten Snowpark-Bibliothek in Snowflake einzubinden, verwenden Sie Folgendes:
PACKAGES = ('com.snowflake:snowpark:latest')
Snowflake unterstützt die Verwendung von Snowpark, Version 0.9.0 oder höher in einer gespeicherten Scala-Prozedur. Beachten Sie jedoch, dass diese Versionen Einschränkungen haben. So unterstützen Versionen vor 1.1.0 beispielsweise nicht die Verwendung von Transaktionen in einer gespeicherten Prozedur.
HANDLER = 'fully_qualified_method_name'
Verwenden Sie den vollqualifizierten Namen der Methode oder Funktion der gespeicherten Prozedur. Dies geschieht typischerweise in der folgenden Form:
com.my_company.my_package.MyClass.myMethod
Wobei:
com.my_company.my_package
entspricht dem Paket, das das Objekt oder die Klasse enthält:
package com.my_company.my_package;
Optionale Parameter¶
Alle Sprachen¶
SECURE
Gibt an, dass die Prozedur sicher ist. Für weitere Informationen zu sicheren Prozeduren finden Sie unter Schutz sensibler Informationen mit sicheren UDFs und gespeicherten Prozeduren.
[ [ NOT ] NULL ]
Gibt an, ob die Funktion NULL-Werte zurückgeben kann oder nur NON-NULL-Werte zurückgeben darf.
Der Standardwert ist NULL (d. h. die gespeicherte Prozedur kann NULL zurückgeben).
CALLED ON NULL INPUT
oder .{ RETURNS NULL ON NULL INPUT | STRICT }
Gibt das Verhalten der gespeicherten Prozedur an, wenn sie mit Null-Eingaben aufgerufen wird. Im Gegensatz zu systemdefinierten Funktionen, die immer Null zurückgeben, wenn eine Eingabe Null ist, können gespeicherte Prozeduren Null-Eingaben verarbeiten und Nicht-Null-Werte zurückgeben, auch wenn eine Eingabe Null ist:
CALLED ON NULL INPUT
ruft immer die gespeicherten Prozeduren mit Null-Eingaben auf. Es liegt an der Prozedur, mit solchen Werten angemessen umzugehen.RETURNS NULL ON NULL INPUT
(oder dessen SynonymSTRICT
) ruft die gespeicherte Prozedur nicht auf, wenn eine Eingabe Null ist, sodass die Anweisungen in der gespeicherten Prozedur nicht ausgeführt werden. Stattdessen wird immer ein Null-Wert zurückgegeben. Beachten Sie, dass die Prozedur bei Nicht-Null-Eingaben immer noch Null zurückgeben kann.
Standard:
CALLED ON NULL INPUT
VOLATILE | IMMUTABLE
Veraltet
Achtung
Diese Schlüsselwörter sind für gespeicherte Prozeduren veraltet. Diese Schlüsselwörter sind nicht für die Verwendung mit gespeicherten Prozeduren gedacht. In einem zukünftigen Release werden diese Schlüsselwörter aus der Dokumentation entfernt.
COMMENT = 'string_literal'
Gibt einen Kommentar für die gespeicherte Prozedur an, der in der Spalte DESCRIPTION der Ausgabe SHOW PROCEDURES angezeigt wird.
Standard:
stored procedure
EXECUTE AS OWNER
oder .EXECUTE AS CALLER
oder .EXECUTE AS RESTRICTED CALLER
Gibt an, ob eine gespeicherte Prozedur mit den Berechtigungen des Eigentümers (gespeicherte Prozedur mit „Eigentümerrechten“) oder mit den Berechtigungen des Aufrufers (gespeicherte Prozedur mit „Aufruferrechten“) ausgeführt werden.
Wenn Sie die Anweisung CREATE PROCEDURE … EXECUTE AS OWNER ausführen, wird die Prozedur als Prozedur mit Eigentümerrechten ausgeführt.
Wenn Sie die Anweisung CREATE PROCEDURE … EXECUTE AS CALLER ausführen, wird die Prozedur künftig als Prozedur mit Aufruferrechten ausgeführt.
Wenn Sie die Anweisung CREATE PROCEDUREEXECUTE … AS RESTRICTED CALLER ausführen, wird die Prozedur künftig als Prozedur mit Aufruferrechten ausgeführt, kann aber möglicherweise nicht mit allen Berechtigungen des Aufrufers ausgeführt werden. Weitere Informationen dazu finden Sie unter Beschränkte Aufruferrechte.
Wenn
EXECUTE AS ...
nicht angegeben ist, wird die Prozedur als gespeicherte Prozedur mit Eigentümerrechten ausgeführt. Gespeicherte Prozeduren mit Eigentümerrechten haben weniger Zugriffsrechte auf die Umgebung des Aufrufers (z. B. Sitzungsvariablen des Anrufers). Snowflake wendet standardmäßig diese höhere Datenschutz- und Sicherheitsstufe an.Weitere Informationen dazu finden Sie unter Erläuterungen zu gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten.
Standard:
OWNER
COPY GRANTS
Gibt an, dass die Zugriffsrechte der ursprünglichen Prozedur beibehalten werden sollen, wenn eine neue Prozedur mit CREATE OR REPLACE PROCEDURE erstellt wird.
Der Parameter kopiert alle Berechtigungen, mit Ausnahme von OWNERSHIP, aus der bestehenden Prozedur in die neue Prozedur. Die neue Prozedur erbt keine der zukünftigen Berechtigungszuweisungen, die für den Objekttyp im Schema definiert sind. Standardmäßig ist die Rolle, die die Anweisung CREATE PROCEDURE ausführt, Eigentümer der neuen Prozedur.
Hinweis:
Die SHOW GRANTS-Ausgabe für die Ersetzungsprozedur listet den Berechtigungsempfänger für die kopierten Berechtigungen als Rolle auf, die die CREATE PROCEDURE-Anweisung ausgeführt hat, und mit dem aktuellen Zeitstempel für die Ausführung der Anweisung.
Die Operation zum Kopieren von Berechtigungen erfolgt atomar im Befehl CREATE PROCEDURE (d. h. innerhalb derselben Transaktion).
Java¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
Der Speicherort (Stagingbereich), der Pfad und der Name der zu importierenden Datei(en). Sie müssen die IMPORTS-Klausel festlegen, um alle Dateien einzuschließen, von denen Ihre gespeicherte Prozedur abhängt:
Wenn Sie eine inline gespeicherte Prozedur schreiben, können Sie diese Klausel weglassen, es sei denn, Ihr Code hängt von Klassen ab, die außerhalb der gespeicherten Prozedur oder der Ressourcendateien definiert sind.
Wenn Sie eine gespeicherte Prozedur mit einem Staging-Handler schreiben, müssen Sie auch den Pfad zu der JAR-Datei angeben, die den Handler-Code der gespeicherten Prozedur enthält.
Die IMPORTS-Definition kann nicht auf Variablen von Argumenten verweisen, die an die gespeicherte Prozedur übergeben werden.
Jede Datei in der IMPORTS-Klausel muss einen eindeutigen Namen haben, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.
TARGET_PATH = stage_path_and_file_name_to_write
Gibt den Speicherort an, in den Snowflake die JAR-Datei schreiben soll, die das Ergebnis der Kompilierung des in
procedure_definition
angegebenen Handler-Quellcodes enthält.Wenn diese Klausel enthalten ist, schreibt Snowflake die resultierende JAR-Datei in den Stagingbereich, der durch den Wert der Klausel angegeben ist. Wenn diese Klausel weggelassen wird, kompiliert Snowflake den Quellcode jedes Mal neu, wenn der Code benötigt wird. In diesem Fall wird die JAR-Datei nicht dauerhaft gespeichert, und der Benutzer muss die JAR-Datei nicht bereinigen.
Snowflake gibt einen Fehler zurück, wenn TARGET_PATH mit einer vorhandenen Datei übereinstimmt. Sie können TARGET_PATH nicht verwenden, um eine vorhandene Datei zu überschreiben.
Wenn Sie sowohl die IMPORTS- als auch die TARGET_PATH-Klausel angeben, muss sich der Dateiname in der TARGET_PATH-Klausel von jedem Dateinamen in der IMPORTS-Klausel unterscheiden, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.
Die erzeugte JAR-Datei bleibt erhalten, bis Sie sie explizit löschen, auch wenn Sie den Vorgang abbrechen. Wenn Sie die Prozedur abbrechen, sollten Sie die JAR-Datei separat entfernen, da die JAR-Datei nicht mehr zur Unterstützung der Prozedur benötigt wird.
Das folgende Beispiel TARGET_PATH würde beispielsweise dazu führen, dass eine Datei
myhandler.jar
erstellt und in den Stagingbereichhandlers
kopiert wird.TARGET_PATH = '@handlers/myhandler.jar'
Wenn Sie diese Prozedur löschen, um sie zu entfernen, müssen Sie auch ihre Handler-JAR-Datei entfernen, z. B. indem Sie den REMOVE-Befehl ausführen.
REMOVE @handlers/myhandler.jar;
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
Die Namen der Integrationen für den externen Zugriff, die benötigt werden, damit der Handler-Code dieser Prozedur auf externe Netzwerke zugreifen kann.
Eine Integration für den externen Zugriff spezifiziert Netzwerkregeln und Geheimnisse, die externe Standorte und Anmeldeinformationen (falls vorhanden) angeben, die vom Handler-Code verwendet werden dürfen, wenn dieser Anforderungen an ein externes Netzwerk stellt, wie z. B. eine externe REST-API.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
Weist die Namen von Geheimnissen Variablen zu, sodass Sie die Variablen verwenden können, um auf die Geheimnisse zu verweisen, wenn Sie Informationen aus Geheimnissen im Handler-Code abrufen.
Geheimnisse, die Sie hier angeben, müssen von der Integration für den externen Zugriff zugelassen werden, die in diesem CREATE PROCEDURE-Befehl als Wert des Parameters EXTERNAL_ACCESS_INTEGRATIONS angegeben wurde.
Der Wert dieses Parameters ist eine durch Kommas getrennte Liste von Zuweisungsausdrücken mit den folgenden Bestandteilen:
secret_name
als Name des zulässigen Geheimnisses.Sie erhalten einen Fehler, wenn Sie einen SECRETS-Wert angeben, dessen Geheimnis nicht auch in einer durch den EXTERNAL_ACCESS_INTEGRATIONS-Parameter angegebenen Integration enthalten ist.
'secret_variable_name'
als die Variable, die im Handler-Code verwendet wird, um Informationen aus dem Geheimnis abzurufen.
Weitere Informationen dazu, einschließlich eines Beispiels, finden Sie unter Verwendung der Integration für den externen Zugriff in einer Funktion oder Prozedur.
Python¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
Der Speicherort (Stagingbereich), der Pfad und der Name der zu importierenden Datei(en). Sie müssen die IMPORTS-Klausel festlegen, um alle Dateien einzuschließen, von denen Ihre gespeicherte Prozedur abhängt:
Wenn Sie eine inline gespeicherte Prozedur schreiben, können Sie diese Klausel weglassen, es sei denn, Ihr Code hängt von Klassen ab, die außerhalb der gespeicherten Prozedur oder der Ressourcendateien definiert sind.
Wenn sich der Code Ihrer gespeicherten Prozedur in einem Stagingbereich befindet, müssen Sie auch einen Pfad zu der Moduldatei angeben, in der sich der Code befindet.
Die IMPORTS-Definition kann nicht auf Variablen von Argumenten verweisen, die an die gespeicherte Prozedur übergeben werden.
Jede Datei in der IMPORTS-Klausel muss einen eindeutigen Namen haben, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
Die Namen der Integrationen für den externen Zugriff, die benötigt werden, damit der Handler-Code dieser Prozedur auf externe Netzwerke zugreifen kann.
Eine Integration für den externen Zugriff spezifiziert Netzwerkregeln und Geheimnisse, die externe Standorte und Anmeldeinformationen (falls vorhanden) angeben, die vom Handler-Code verwendet werden dürfen, wenn dieser Anforderungen an ein externes Netzwerk stellt, wie z. B. eine externe REST-API.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
Weist die Namen von Geheimnissen Variablen zu, sodass Sie die Variablen verwenden können, um auf die Geheimnisse zu verweisen, wenn Sie Informationen aus Geheimnissen im Handler-Code abrufen.
Geheimnisse, die Sie hier angeben, müssen von der Integration für den externen Zugriff zugelassen werden, die in diesem CREATE PROCEDURE-Befehl als Wert des Parameters EXTERNAL_ACCESS_INTEGRATIONS angegeben wurde.
Der Wert dieses Parameters ist eine durch Kommas getrennte Liste von Zuweisungsausdrücken mit den folgenden Bestandteilen:
secret_name
als Name des zulässigen Geheimnisses.Sie erhalten einen Fehler, wenn Sie einen SECRETS-Wert angeben, dessen Geheimnis nicht auch in einer durch den EXTERNAL_ACCESS_INTEGRATIONS-Parameter angegebenen Integration enthalten ist.
'secret_variable_name'
als die Variable, die im Handler-Code verwendet wird, um Informationen aus dem Geheimnis abzurufen.
Weitere Informationen dazu, einschließlich eines Beispiels, finden Sie unter Verwendung der Integration für den externen Zugriff in einer Funktion oder Prozedur.
Scala¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
Der Speicherort (Stagingbereich), der Pfad und der Name der zu importierenden Datei(en). Sie müssen die IMPORTS-Klausel festlegen, um alle Dateien einzuschließen, von denen Ihre gespeicherte Prozedur abhängt:
Wenn Sie eine inline gespeicherte Prozedur schreiben, können Sie diese Klausel weglassen, es sei denn, Ihr Code hängt von Klassen ab, die außerhalb der gespeicherten Prozedur oder der Ressourcendateien definiert sind.
Wenn Sie eine gespeicherte Prozedur mit einem Staging-Handler schreiben, müssen Sie auch den Pfad zu der JAR-Datei angeben, die den Handler-Code der gespeicherten Prozedur enthält.
Die IMPORTS-Definition kann nicht auf Variablen von Argumenten verweisen, die an die gespeicherte Prozedur übergeben werden.
Jede Datei in der IMPORTS-Klausel muss einen eindeutigen Namen haben, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.
TARGET_PATH = stage_path_and_file_name_to_write
Gibt den Speicherort an, in den Snowflake die JAR-Datei schreiben soll, die das Ergebnis der Kompilierung des in
procedure_definition
angegebenen Handler-Quellcodes enthält.Wenn diese Klausel enthalten ist, schreibt Snowflake die resultierende JAR-Datei in den Stagingbereich, der durch den Wert der Klausel angegeben ist. Wenn diese Klausel weggelassen wird, kompiliert Snowflake den Quellcode jedes Mal neu, wenn der Code benötigt wird. In diesem Fall wird die JAR-Datei nicht dauerhaft gespeichert, und der Benutzer muss die JAR-Datei nicht bereinigen.
Snowflake gibt einen Fehler zurück, wenn TARGET_PATH mit einer vorhandenen Datei übereinstimmt. Sie können TARGET_PATH nicht verwenden, um eine vorhandene Datei zu überschreiben.
Wenn Sie sowohl die IMPORTS- als auch die TARGET_PATH-Klausel angeben, muss sich der Dateiname in der TARGET_PATH-Klausel von jedem Dateinamen in der IMPORTS-Klausel unterscheiden, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.
Die erzeugte JAR-Datei bleibt erhalten, bis Sie sie explizit löschen, auch wenn Sie den Vorgang abbrechen. Wenn Sie die Prozedur abbrechen, sollten Sie die JAR-Datei separat entfernen, da die JAR-Datei nicht mehr zur Unterstützung der Prozedur benötigt wird.
Das folgende Beispiel TARGET_PATH würde beispielsweise dazu führen, dass eine Datei
myhandler.jar
erstellt und in den Stagingbereichhandlers
kopiert wird.TARGET_PATH = '@handlers/myhandler.jar'
Wenn Sie diese Prozedur löschen, um sie zu entfernen, müssen Sie auch ihre Handler-JAR-Datei entfernen, z. B. indem Sie den REMOVE-Befehl ausführen.
REMOVE @handlers/myhandler.jar;
Anforderungen an die Zugriffssteuerung¶
Eine Rolle, die zur Ausführung dieser Operation verwendet wird, muss mindestens die folgenden Berechtigungen haben:
Berechtigung |
Objekt |
Anmerkungen |
---|---|---|
CREATE PROCEDURE |
Schema |
|
USAGE |
Prozedur |
Wenn Sie einer Rolle die Berechtigung USAGE für die neu erstellte Prozedur erteilen, können Benutzer mit dieser Rolle die Prozedur an anderer Stelle in Snowflake aufrufen. |
USAGE |
Integration für externen Zugriff |
Erforderlich bei Integrationen, die bei der Erstellung der Prozedur angegeben wurden, falls vorhanden. Weitere Informationen dazu finden Sie unter CREATE EXTERNAL ACCESS INTEGRATION. |
READ |
Geheimnis |
Erforderlich für Geheimnisse, die bei der Erstellung der Prozedur angegeben wurden, falls vorhanden. Weitere Informationen dazu finden Sie unter Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen und Verwendung der Integration für den externen Zugriff in einer Funktion oder Prozedur. |
USAGE |
Schema |
Erforderlich bei Schemas, die Geheimnisse enthalten, die bei der Erstellung der Prozedur angegeben wurden, falls vorhanden. Weitere Informationen dazu finden Sie unter Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen und Verwendung der Integration für den externen Zugriff in einer Funktion oder Prozedur. |
USAGE-Berechtigung für die übergeordnete Datenbank und das Schema ist erforderlich, um Operationen an einem beliebigen Objekt in einem Schema durchzuführen.
Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.
Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.
Allgemeine Nutzungshinweise¶
CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.
Weitere Hinweise zur Verwendung finden Sie im Folgenden.
Alle Handler-Sprachen¶
Gespeicherte Prozeduren unterstützen das Überladen. Zwei Prozeduren können denselben Namen haben, wenn sie eine unterschiedliche Anzahl von Parametern oder unterschiedliche Datentypen für ihre Parameter aufweisen.
Gespeicherte Prozeduren sind nicht atomar. Wenn eine Anweisung in einer gespeicherten Prozedur fehlschlägt, werden die anderen Anweisungen in der gespeicherten Prozedur nicht unbedingt zurückgesetzt. Weitere Informationen zu gespeicherten Prozeduren und Transaktionen finden Sie unter Transaktionsmanagement.
Hinweis zu Metadaten:
Achtung
Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
Tipp
Wenn Ihr Unternehmen eine Mischung aus gespeicherten Prozeduren mit Aufruferrechten und mit Eigentümerrechten verwendet, möchten Sie vielleicht eine Namenskonvention für Ihre gespeicherten Prozeduren verwenden, um anzugeben, ob eine einzelne gespeicherte Prozedur eine gespeicherte Prozedur mit Aufruferrechten oder eine gespeicherte Prozedur mit Eigentümerrechten ist.
Java¶
Siehe die bekannten Einschränkungen.
Javascript¶
Eine gespeicherte JavaScript-Prozedur kann nur einen einzigen Wert zurückgeben, z. B. eine Zeichenfolge (beispielsweise ein Erfolgs-/Fehler-Indikator) oder eine Zahl (z. B. ein Fehlercode). Wenn Sie umfangreichere Daten zurückgeben müssen, können Sie einen VARCHAR-Wert verwenden, der durch ein Trennzeichen (z. B. ein Komma) getrennte Werte enthält, oder Sie verwenden einen Datentyp für semistrukturierte Daten (wie VARIANT).
Python¶
Siehe die bekannten Einschränkungen.
Scala¶
Siehe die bekannten Einschränkungen.
Nutzungshinweise zu CREATE OR ALTER PROCEDURE¶
Es gelten alle Einschränkungen des Befehls ALTER PROCEDURE.
Es gelten alle unter Nutzungshinweise zu CREATE OR ALTER FUNCTION beschriebenen Einschränkungen.
Beispiele¶
Dadurch wird eine einfache gespeicherte Prozedur erstellt, die einen fest codierten Wert zurückgibt. Dies ist unrealistisch, zeigt jedoch die grundlegende SQL-Syntax mit minimalem JavaScript-Code:
CREATE OR REPLACE PROCEDURE sp_pi()
RETURNS FLOAT NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
return 3.1415926;
$$
;
Dies zeigt ein realistischeres Beispiel, das einen Aufruf der JavaScript-API enthält. Eine umfangreichere Version dieser Prozedur könnte es einem Benutzer ermöglichen, Daten in eine Tabelle einzufügen, für die der Benutzer keine Berechtigungen zum direkten Einfügen hatte. JavaScript-Anweisungen konnten die Eingabeparameter nur überprüfen und SQL INSERT
ausführen, wenn bestimmte Anforderungen erfüllt waren.
CREATE OR REPLACE PROCEDURE stproc1(FLOAT_PARAM1 FLOAT)
RETURNS STRING
LANGUAGE JAVASCRIPT
STRICT
EXECUTE AS OWNER
AS
$$
var sql_command =
"INSERT INTO stproc_test_table1 (num_col1) VALUES (" + FLOAT_PARAM1 + ")";
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Succeeded."; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
$$
;
Weitere Beispiele finden Sie unter Verwenden von gespeicherten Prozeduren.
Inline-Handler¶
Der Code im folgenden Beispiel erstellt eine Prozedur namens my_proc
mit einer in Python geschriebenen Inline-Handler-Funktion run
. Über die PACKAGES-Klausel verweist der Code auf die mitgelieferte Snowpark-Bibliothek für Python, deren Session
-Objekt erforderlich ist, wenn Python die Handler-Sprache der Prozedur ist.
CREATE OR REPLACE PROCEDURE my_proc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
AS
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
Staging-Handler¶
Der Code im folgenden Beispiel erstellt eine Prozedur mit dem Namen my_proc
mit einer in Java geschriebenen und in einem Stagingbereich bereitgestellten Handler-Methode MyClass.myMethod
. Über die PACKAGES-Klausel verweist der Code auf die mitgelieferte Snowpark-Bibliothek für Java, deren Session
-Objekt erforderlich ist, wenn Java die Handler-Sprache der Prozedur ist. Mit der IMPORTS-Klausel verweist der Code auf die JAR-Stagingdatei, die den Handler-Code enthält.
CREATE OR REPLACE PROCEDURE my_proc(fromTable STRING, toTable STRING, count INT)
RETURNS STRING
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
IMPORTS = ('@mystage/myjar.jar')
HANDLER = 'MyClass.myMethod';
Erstellen und Ändern einer Prozedur mit dem Befehl CREATE OR ALTER PROCEDURE¶
Erstellen Sie eine gespeicherte Python-Prozedur mit Eigentümerrechten, mit externen Integration für externen Zugriff und Standard-OWNER-Berechtigungen.
CREATE OR ALTER PROCEDURE python_add1(A NUMBER)
RETURNS NUMBER
LANGUAGE PYTHON
HANDLER='main'
RUNTIME_VERSION=3.10
EXTERNAL_ACCESS_INTEGRATIONS=(example_integration)
PACKAGES = ('snowflake-snowpark-python')
EXECUTE AS OWNER
AS
$$
def main(session, a):
return a+1
$$;
Ändern der Geheimnisse der gespeicherten Prozedur und Ändern der gespeichertes Prozedur in eine Prozedur mit Aufruferrechten:
CREATE OR ALTER PROCEDURE python_add1(A NUMBER)
RETURNS NUMBER
LANGUAGE PYTHON
HANDLER='main'
RUNTIME_VERSION=3.10
EXTERNAL_ACCESS_INTEGRATIONS=(example_integration)
secrets=('secret_variable_name'=secret_name)
PACKAGES = ('snowflake-snowpark-python')
EXECUTE AS CALLER
AS
$$
def main(session, a):
return a+1
$$;