Übersicht zu gespeicherten Prozeduren

Sie können gespeicherte Prozeduren schreiben, um das System mittels prozeduralem Code zu erweitern, der SQL ausführt. In einer gespeicherten Prozedur können Sie Programmsteuerungskonstrukte verwenden, um Verzweigungen und Schleifen auszuführen. Sobald Sie eine gespeicherte Prozedur erstellt haben, können Sie diese unbegrenzt wiederverwenden.

Die Logik einer Prozedur, d. h. ihr Handler, wird in einer der unterstützten Sprachen geschrieben. Sobald der Handler verfügbar ist, können Sie mit dem Befehl CREATE PROCEDURE eine Prozedur erstellen und anschließend mit einer CALL-Anweisung die Prozedur aufrufen.

Eine gespeicherte Prozedur kann einzelne Werte oder (wenn sie von der Handler-Sprache unterstützt wird) Tabellendaten zurückgeben. Weitere Informationen zu unterstützten Rückgabetypen finden Sie unter CREATE PROCEDURE.

Bemerkung

Um eine anonyme Prozedur sowohl zu erstellen als auch aufzurufen, verwenden Sie CALL (mit anonymen Prozeduren). Das Erstellen und Aufrufen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.

Bemerkung

Eine gespeicherte Prozedur ist wie eine UDF, jedoch unterscheiden sich beide in wichtigen Punkten. Weitere Informationen dazu finden Sie unter Entscheidung über das Schreiben einer gespeicherten Prozedur oder einer benutzerdefinierten Funktion.

Unter diesem Thema:

Was ist eine gespeicherte Prozedur?

Eine gespeicherte Prozedur enthält von Ihnen geschriebene Verarbeitungslogik, die Sie über SQL aufrufen können. Die Logik einer gespeicherten Prozedur führt typischerweise Datenbankoperationen durch Ausführung von SQL-Anweisungen aus.

Mit einer gespeicherten Prozedur können Sie auch Folgendes tun:

  • Dynamisches Erstellen und Ausführen von SQL-Anweisungen.

  • Ausführen von Code, der mit den Berechtigungen der Rolle ausgeführt wird, die Eigentümer der Prozedur ist, und nicht mit den Berechtigungen der Rolle, die die Prozedur ausführt.

    Auf diese Weise können Eigentümer gespeicherter Prozeduren die Befugnis zum Ausführen bestimmter Operationen an Benutzer delegieren, die diese sonst nicht ausführen könnten. Es gibt bei diesen gespeicherten Prozeduren mit Eigentümerrechten jedoch einige Einschränkungen.

Vielleicht möchten Sie eine gespeicherte Prozedur verwenden, um eine Aufgabe zu automatisieren, die mehrere SQL-Anweisungen erfordert und häufig ausgeführt wird. Angenommen, Sie möchten eine Datenbank bereinigen, indem Sie alle Daten löschen, die älter als ein bestimmtes Datum sind. Sie können mehrere DELETE-Anweisungen schreiben, von denen jede Daten aus einer bestimmten Tabelle löscht. Sie können alle diese Anweisungen in eine einzelne gespeicherte Prozedur einfügen und einen Parameter übergeben, der das Datum des Stichtags angibt. Dann können Sie einfach die Prozedur aufrufen, um die Datenbank zu bereinigen. Wenn sich Ihre Datenbank ändert, können Sie die Prozedur aktualisieren, um zusätzliche Tabellen zu bereinigen. Wenn mehrere Benutzer den Bereinigungsbefehl verwenden, können sie die Prozedur aufrufen, anstatt sich jeden Tabellennamen zu merken und jede Tabelle einzeln zu bereinigen.

Beispiel einer gespeicherten Prozedur

Der Code im folgenden Beispiel erstellt eine gespeicherte Prozedur namens myproc mit einem Python-Handler namens run.

create or replace procedure myproc(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

Im folgenden Beispiel wird die gespeicherte Prozedur myproc aufgerufen:

CALL myproc('table_a', 'table_b', 5);
Copy

Unterstützte Sprachen

Sie schreiben den Handler einer Prozedur, d. h. dessen Logik, in einer der unterstützten Programmiersprachen. Jede Sprache ermöglicht es Ihnen, Daten im Rahmen der durch die Sprache und ihrer Laufzeitumgebung vorgegebenen Einschränkungen zu bearbeiten. Unabhängig von der Sprache des Handlers wird die Prozedur selbst auf die gleiche Weise erstellt, wie bei Verwendung von SQL durch Angabe des Handlers und der Sprache des Handlers.

Sie können einen Handler in einer der folgenden Sprachen schreiben:

Sprache

Entwicklerhandbuch

Java (unter Verwendung der Snowpark-API)

Schreiben von gespeicherten Prozeduren in Java

JavaScript

Schreiben von gespeicherten Prozeduren in JavaScript

Python (unter Verwendung der Snowpark-API)

Schreiben von gespeicherten Prozeduren in Python

Scala (unter Verwendung der Snowpark-API)

Schreiben von gespeicherten Prozeduren in Scala

Snowflake Scripting (SQL)

Schreiben von gespeicherten Prozeduren in Snowflake Scripting

Wahl der Sprache

Sie schreiben den Handler einer Prozedur, d. h. dessen Logik, in einer der unterstützten Programmiersprachen. Jede Sprache ermöglicht es Ihnen, Daten im Rahmen der durch die Sprache und ihrer Laufzeitumgebung vorgegebenen Einschränkungen zu bearbeiten.

Kriterien für die Wahl einer bestimmte Sprache:

  • Sie haben bereits Code in dieser Sprache.

    Wenn Sie z. B. bereits eine Java-Methode haben, die als Handler funktioniert, und das Objekt der Methode in einer JAR-Datei enthalten ist, können Sie die JAR-Datei in einen Stagingbereich kopieren, den Handler als Klasse und Methode angeben und dann als Sprache Java angeben.

  • Die Sprache bietet Möglichkeiten, die andere nicht bieten.

  • Die Sprache verfügt über Bibliotheken, die Ihnen bei der gewünschten Verarbeitung helfen können.

Bei der Wahl einer Sprache sollten Sie auch die Speicherorte der Handler beachten. Nicht alle Sprachen unterstützen das Verweisen auf einen Handler in einem Stagingbereich (der Handler-Code muss stattdessen inline sein). Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.

Sprache

Speicherort des Handlers

Java

Inline oder Staging

JavaScript

Inline

Python

Inline oder Staging

Scala

Inline oder Staging

Snowflake Scripting

Inline

Entwicklerhandbücher

Richtlinien und Einschränkungen

Tipps:

Weitere Tipps zum Schreiben von gespeicherten Prozeduren finden Sie unter Verwenden von gespeicherten Prozeduren.

Snowflake-Einschränkungen:

Sie können die Stabilität innerhalb der Snowflake-Umgebung sicherstellen, indem die Snowflake-Einschränkungen beim Entwickeln berücksichtigen. Weitere Informationen dazu finden Sie unter Entwerfen von Handlern unter Berücksichtigung der Snowflake-bedingten Einschränkungen.

Namensgebung:

Achten Sie darauf, Prozeduren so zu benennen, dass es nicht zu Kollisionen mit anderen Prozeduren kommt. Weitere Informationen dazu finden Sie unter Benennen und Überladen von Prozeduren und UDFs.

Argumente:

Geben Sie die Argumente für Ihre gespeicherte Prozedur an, und geben Sie an, welche Argumente optional sind. Weitere Informationen dazu finden Sie unter Definieren von Argumenten für UDFs und gespeicherte Prozeduren.

Zuordnung von Datentypen:

Für jede Handler-Sprache gibt es einen separaten Satz von Zuordnungen zwischen den Datentypen der Sprache und den SQL-Typen, die für Argumente und Rückgabewerte verwendet werden. Weitere Informationen zur Zuordnung in den einzelnen Sprachen finden Sie unter Zuordnung von Datentypen zwischen SQL und Handler-Sprachen.

Schreiben von Handlern

Sprachen des Handlers:

Sprachspezifische Informationen zum Schreiben eines Handlers finden Sie unter Unterstützte Sprachen.

Externer Netzwerkzugriff:

Mit externem Netzwerkzugriff können Sie auf externe Netzwerkstandorte zugreifen. Sie können einen sicheren Zugriff auf bestimmte Netzwerkstandorte außerhalb von Snowflake erstellen und diesen Zugriff dann innerhalb des Handler-Codes verwenden.

Protokollierung und Ablaufverfolgung:

Sie können Code-Aktivitäten erfassen, indem Sie Protokollmeldungen und Ablaufverfolgungsereignisse aufzeichnen und die Daten in einer Datenbank speichern, die Sie später abfragen können.

Sicherheit

Ob Sie eine gespeicherte Prozedur mit Aufruferrechten oder mit Eigentümerrechten ausführen, kann sich auf die Informationen auswirken, auf die die Prozedur Zugriff hat, und auf die Aufgaben, die sich damit ausführen lassen. Weitere Informationen dazu finden Sie unter Understanding Caller’s Rights and Owner’s Rights Stored Procedures.

Bei gespeicherten Prozeduren müssen bestimmte Sicherheitsaspekte wie bei benutzerdefinierten Funktionen (UDFs) berücksichtigt werden. Weitere Informationen dazu finden Sie unter:

Bereitstellen von Handler-Code

Beim Erstellen einer Prozedur können Sie deren Handler, der die Prozedurlogik implementiert, als Inline-Code in der CREATE PROCEDURE-Anweisung angeben oder als Code außerhalb der Anweisung als kompilierten Code, der gepackt und in einen Stagingbereich kopiert wird.

Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.

Prozeduren erstellen und aufrufen

Sie verwenden SQL, um eine Prozedur zu erstellen und aufzurufen.

  • Sobald Sie den Handler-Code geschrieben haben, können Sie eine gespeicherte Prozedur erstellen, indem Sie die Anweisung CREATE PROCEDURE ausführen und den Handler der Prozedur angeben. Weitere Informationen dazu finden Sie unter Erstellen einer gespeicherten Prozedur.

  • Um eine Prozedur aufzurufen, führen Sie eine SQL-CALL-Anweisung aus, die die Prozedur als Parameter angibt. Weitere Informationen dazu finden Sie unter Aufrufen einer gespeicherten Prozedur.

  • Um eine temporäre Prozedur zu erstellen, die nur einmal ausgeführt und dann verworfen wird, verwenden Sie WITH…CALL. Weitere Informationen dazu finden Sie unter CALL (mit anonymen Prozeduren).