Kategorien:

DDL für benutzerdefinierte Funktionen, externe Funktionen und gespeicherte Prozeduren

CREATE PROCEDURE

Erstellt eine neue gespeicherte Prozedur. Eine gespeicherte Prozedur enthält JavaScript-Code.

Siehe auch:

ALTER PROCEDURE , DESCRIBE PROCEDURE , DROP PROCEDURE , SHOW PROCEDURES

CALL

Syntax

CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ]
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  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.

Erforderliche Parameter

Name ( [ Argumentname Argumentdatentyp ] [ , ... ] )

Gibt den Bezeichner (und optional ein oder mehrere Argumente/Eingaben) für die gespeicherte Prozedur an. Der Bezeichner muss für das Schema, in dem die gespeicherte Prozedur erstellt wird, nicht eindeutig sein, da gespeicherte Prozeduren durch ihren Namen und ihre Argumenttypen identifiziert und aufgelöst werden.

Der Bezeichner muss jedoch 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. "My object"). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß- und Kleinschreibung zu beachten.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.

RETURNS Ergebnisdatentyp [ NOT NULL ]:

Gibt die von der gespeicherten Prozedur zurückgegebenen Ergebnisse an.

In der Praxis kann der zurückgegebene Wert nicht verwendet werden, da der Aufruf nicht Teil eines Ausdrucks sein kann.

LANGUAGE JAVASCRIPT

Gibt an, dass die gespeicherte Prozedur JavaScript-Code enthält. Derzeit wird als Sprache nur JavaScript unterstützt. Wenn Sie eine andere Sprache angeben, wird eine Fehlermeldung angezeigt.

AS Prozedurdefinition

Definiert den JavaScript-Code, der von der gespeicherten Prozedur ausgeführt wird. Die Definition kann aus beliebigem gültigen JavaScript bestehen. Snowflake überprüft den Code zum Zeitpunkt der Erstellung der gespeicherten Prozedur jedoch nicht (d. h. die Erstellung der gespeicherten Prozedur ist erfolgreich, unabhängig davon, ob der Code gültig ist). Wenn der Code nicht gültig ist, werden bei Aufruf der gespeicherten Prozedur Fehler zurückgegeben.

Die Trennzeichen um die Prozedurdefinition können einfache Anführungszeichen oder doppelte Dollarzeichen sein. Eine Verwendung von „$$“ als Trennzeichen erleichtert das Schreiben von gespeicherten Prozeduren, die einfache Anführungszeichen enthalten.

JavaScript erlaubt Backquotes (auch „Backticks“ genannt) um Zeichenfolgen, die Zeilenumbrüche enthalten.

Im folgenden Beispiel 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.';
  $$;

Weitere Informationen zu gespeicherten Prozeduren finden Sie unter:

Optionale Parameter

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 Synonym STRICT) 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

Gibt das Verhalten der gespeicherten Prozedur bei der Ergebnisrückgabe an:

  • VOLATILE: Die Prozedur kann für verschiedene Zeilen unterschiedliche Werte zurückgeben, auch bei gleicher Eingabe (z. B. aufgrund von Nichtdeterminismus und Statefullness).

  • IMMUTABLE: Die Prozedur geht davon aus, dass sie bei Aufruf mit den gleichen Eingabewerten immer das gleiche Ergebnis liefert. Diese Garantie wird nicht geprüft. Die Angabe von IMMUTABLE für eine Prozedur, die unterschiedliche Werte für dieselbe Eingabe zurückgibt, führt zu einem undefinierten Verhalten.

Standard: VOLATILE

COMMENT = 'Zeichenfolgenliteral'

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 CALLER | OWNER

Eine gespeicherte Prozedur kann 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 CALLER ausführen, wird die Prozedur als Prozedur mit Aufruferrechten ausgeführt. Wenn Sie CREATE PROCEDURE ... EXECUTE AS OWNER ausführen, dann wird die Prozedur als Prozedur mit Eigentümerrechten ausgeführt. Standardmäßig wird die Prozedur als gespeicherte Prozedur mit Eigentümerrechten ausgeführt, wenn zum Zeitpunkt der Erstellung der Prozedur weder OWNER noch CALLER explizit angegeben wurden. Gespeicherte Prozeduren mit Eigentümerrechten haben weniger Zugriffsrechte auf die Umgebung des Anrufers (z. B. Sitzungsvariablen des Anrufers). Snowflake wendet standardmäßig diese höhere Datenschutz- und Sicherheitsstufe an. Weitere Informationen zu Prozeduren mit Eigentümer- und Aufruferrechten finden Sie unter Berechtigungen für Datenbankobjekte, auf die gespeicherte Prozeduren zugreifen.

Standard: OWNER

Nutzungshinweise

  • Eine gespeicherte Prozedur kann nur einen einzigen Wert zurückgeben, z. B. eine Zeichenfolge (beispielsweise eine Erfolgs-/Fehleranzeige) oder eine Zahl (z. B. einen Fehlercode). Wenn Sie umfangreichere Informationen zurückgeben müssen, können Sie ein VARCHAR zurückgeben, das durch ein Trennzeichen (z. B. ein Komma) getrennte Werte oder einen semistrukturierten Datentyp (wie VARIANT) enthält.

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

Tipp

Wenn Ihr Unternehmen eine Mischung aus gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten verwendet, wollen 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.

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.