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:

  1. 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.

  2. 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.

  3. 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-Handler MyClass.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";
        }
      }
    $$;
    
    Copy

    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 oder my_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"
$$;
Copy

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')
  imports = ('@mystage/myjar.jar')
  handler = 'MyClass.myMethod';
Copy