Erstellen einer gespeicherten Prozedur¶
Eine gespeicherte Prozedur wird mit einem CREATE PROCEDURE-Befehl erstellt, der die Eigenschaften der Prozedur festlegt, einschließlich des für deren Logik zu verwendenden Handlers.
Unter diesem Thema sind die Schritte zum Erstellen einer Prozedur aufgeführt. Beispiele dazu finden Sie in der Referenz zu CREATE PROCEDURE.
Bemerkung
Sie können auch eine Prozedur erstellen und aufrufen, die nicht zur späteren Verwendung gespeichert wird. Viele Eigenschaften für diese Art von Prozedur sind dieselben wie für eine gespeicherte Prozedur. Weitere Informationen dazu finden Sie unter CALL (mit anonymen Prozeduren).
Erstellen einer gespeicherten Prozedur¶
Zum Erstellen einer gespeicherten Prozedur führen Sie die folgenden Schritte aus:
Schreiben Sie den Handler-Code, der bei Aufruf der Prozedur ausgeführt werden soll.
Sie können eine der unterstützten Handler-Sprachen verwenden. Weitere Informationen dazu finden Sie unter Unterstützte Sprachen.
Legen Sie fest, ob Sie den Handler-Code inline in der SQL-Anweisung CREATE PROCEDURE verwenden möchten oder auf den Handler-Code in einem Stagingbereich verweisen möchten.
Beide Methoden haben Vor- und Nachteile. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Führen Sie eine CREATE PROCEDURE-Anweisung in SQL aus, und geben Sie dabei die Eigenschaften der Prozedur an.
Der Code im folgenden Beispiel erstellt eine Prozedur namens
myProc
mit dem Inline-HandlerMyClass.myMethod
. Die Handler-Sprache ist Java, die (wie in Scala und Python geschriebene Prozedur-Handler) ein Session-Objekt aus der Snowpark-Bibliothek benötigt. Hier bezieht sich die PACKAGES-Klausel auf die Snowpark-Bibliothek, die in Snowflake enthalten ist.CREATE OR REPLACE PROCEDURE myProc(fromTable STRING, toTable STRING, count INT) RETURNS STRING LANGUAGE JAVA RUNTIME_VERSION = '11' PACKAGES = ('com.snowflake:snowpark:latest') HANDLER = 'MyClass.myMethod' AS $$ import com.snowflake.snowpark_java.*; public class MyClass { public String myMethod(Session session, String fromTable, String toTable, int count) { session.table(fromTable).limit(count).write().saveAsTable(toTable); return "Success"; } } $$;
Im Folgenden werden einige der Eigenschaften beschrieben, die beim Erstellen einer Prozedur erforderlich sind oder üblicherweise verwendet werden.
Prozedurname.
Der Name muss nicht mit dem Namen des Handlers übereinstimmen. Die CREATE PROCEDURE-Anweisung verknüpft den Prozedurnamen mit dem Handler.
Für weitere Informationen zu Einschränkungen und Konventionen bei der Namensvergabe finden Sie unter Benennen und Überladen von Prozeduren und UDFs.
Prozedurargumente, falls vorhanden.
Siehe Definieren von Argumenten für UDFs und gespeicherte Prozeduren.
Rückgabetyp mit der RETURNS-Klausel.
Weitere Informationen zum Zuordnen von SQL-Datentypen zu Handler-Datentypen in Snowflake finden Sie unter Zuordnung von Datentypen zwischen SQL und Java.
Handler-Name mit der HANDLER-Klausel.
Falls erforderlich, ist dies der Name der Klasse oder Methode, die den Code enthält, der bei Aufruf der Prozedur ausgeführt wird. Die Angabe eines Handler-Namens ist nur für Handler erforderlich, die in Java, Python oder Scala geschrieben wurden. Bei JavaScript- und Snowflake Scripting-Handlern wird der gesamte Inline-Code als Handler ausgeführt.
In der folgenden Tabelle wird gezeigt, welches Format der Wert der HANDLER-Klausel in Abhängigkeit von der Handler-Sprache annimmt.
Sprache des Handlers
Format des Werts
Java
Klassen- und Methodenname.
Beispiel:
MyClass.myMethod
JavaScript
Keine.
Python
Klassen- und Methodenname bei Verwendung einer Klasse, ansonsten Funktionsname.
Beispiel:
module.my_function
odermy_function
Scala
Objekt- und Methodenname.
Beispiel:
MyObject.myMethod
Snowflake Scripting
Keine.
Vom Handler benötigte Abhängigkeiten, falls vorhanden, unter Verwendung der IMPORTS- oder PACKAGES-Klausel.
Für einen in Java, Python oder Scala geschriebenen Handler müssen Sie die Snowpark-Bibliothek angeben, wie in der CREATE PROCEDURE-Referenz beschrieben.
Weitere Informationen zur Bereitstellung der Abhängigkeiten für den Handler finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.
Laufzeitumgebung der Handler-Sprache mit Klausel RUNTIME_VERSION.
Wenn die Handler-Sprache Java, Python oder Scala ist, verwenden Sie die RUNTIME_VERSION-Klausel, um anzugeben, welche unterstützte Laufzeitversion verwendet werden soll. Wenn Sie die Klausel weglassen, verwendet Snowflake die Standardeinstellung, die sich in Zukunft ändern kann.
Beispiele¶
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.8'
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"
$$;
Handler in einem Stagingbereich¶
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')
IMPORRTS = ('@mystage/myjar.jar')
HANDLER = 'MyClass.myMethod';