ABLAUF ERSTELLEN

Gilt für:check marked yes Databricks SQL Databricks Runtime 17.0 und höher als "Unity-Katalog" markiert

Erstellt eine Prozedur im Unity-Katalog, die Argumente akzeptiert oder ändert, eine Reihe von SQL-Anweisungen ausführt und optional einen Resultset zurückgibt.

Syntax

CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]
    procedure_name ( [ procedure_parameter [, ...] ] )
    [ characteristic [...] ]
    AS compound_statement

procedure_parameter
    [ IN | OUT | INOUT ] parameter_name data_type
    [ DEFAULT default_expression ] [ COMMENT parameter_comment ]

characteristic
  { LANGUAGE SQL |
    SQL SECURITY { INVOKER | DEFINER } |
    NOT DETERMINISTIC |
    COMMENT procedure_comment |
    DEFAULT COLLATION default_collation_name |
    MODIFIES SQL DATA }

Die Parameter

  • ODER ERSETZEN

    Wenn angegeben, wird eine Prozedur mit demselben Namen ersetzt. Sie können eine vorhandene Funktion nicht durch eine Prozedur ersetzen; Dadurch wird ROUTINE_ALREADY_EXISTS erhöht. Sie können diesen Parameter nicht mit IF NOT EXISTS; angeben, dass beide INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • WENN NICHT EXISTIERT

    Wenn angegeben, wird die Prozedur nur erstellt, wenn eine Prozedur mit diesem Namen noch nicht vorhanden ist. Wenn eine Prozedur mit demselben Namen vorhanden ist, wird die Anweisung ignoriert. Sie können diesen Parameter nicht mit OR REPLACE; angeben, dass beide INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Ein Name für die Prozedur. Optional können Sie den Prozedurnamen mit einem Schemanamen qualifizieren. Wenn der Name nicht qualifiziert ist, wird die permanente Prozedur im aktuellen Schema erstellt.

    Der Prozedurname muss für alle Routinen (Prozeduren und Funktionen) im Schema eindeutig sein. Wenn eine Routine mit demselben Namen vorhanden ist und weder OR REPLACEIF NOT EXISTS angegeben noch angegeben wird, löst Azure Databricks ROUTINE_ALREADY_EXISTS aus.

  • procedure_parameter

    Gibt einen Parameter der Prozedur an.

    • parameter_name

      Der Parametername muss innerhalb der Prozedur eindeutig sein; andernfalls löst Azure Databricks DUPLICATE_ROUTINE_PARAMETER_NAMES aus.

    • IN, INOUT oder OUT

      Beschreibt optional den Modus des Parameters.

      • IN

        Definiert einen Nur-Eingabe-Parameter. Dies ist die Standardeinstellung.

      • INOUT

        Definiert einen Parameter, der ein Eingabeausgabeargument akzeptiert. Wenn die Prozedur ohne unbehandelten Fehler abgeschlossen wird, gibt sie den endgültigen Parameterwert als Ausgabe zurück.

      • AUS

        Definiert einen Ausgabeparameter. Der Parameter wird auf NULL initialisiert und, wenn die Prozedur ohne einen unbehandelten Fehler abgeschlossen wird, gibt er den endgültigen Parameterwert als Ausgabe zurück.

    • Datentyp

      Jeder unterstützte Datentyp.

    • STANDARD default_expression

      Ein optionaler Standardwert, der verwendet wird, wenn ein Funktionsaufruf dem Parameter kein Argument zuweist. default_expression muss umwandelbar in data_type sein. Der Ausdruck darf nicht auf einen anderen Parameter verweisen oder eine Unterabfrage enthalten.

      Wenn Sie einen Standardwert für einen Parameter angeben, müssen alle folgenden Parameter ebenfalls einen Standardwert haben.

      DEFAULT wird für OUT oder INOUT Parameter nicht unterstützt; die Angabe einer wird PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT ausgelöst.

    • KOMMENTAR Kommentar

      Eine optionale Beschreibung des Parameters. comment muss ein STRING-Literal sein.

  • compound_statement

    Eine SQL-Verbund-Anweisung (BEGIN ... END) mit der Definition der SQL-Prozedur.

    Beim Erstellen der Prozedur wird die syntaktische Korrektheit überprüft. Der Prozedurkörper wird erst auf semantische Korrektheit überprüft, wenn die Prozedur aufgerufen wird.

  • charakteristisch

    Einer von SQL SECURITY INVOKER oder SQL SECURITY DEFINER, und LANGUAGE SQL sind erforderlich. Alle anderen sind optional. Sie können eine beliebige Anzahl von Merkmalen in beliebiger Reihenfolge angeben, aber Sie können jede Klausel nur einmal angeben.

    • LANGUAGE SQL

      Die Sprache der Funktionsimplementierung.

    • SQL SECURITY INVOKER

      Gibt an, dass alle SQL-Anweisungen im Textkörper der Prozedur unter der Autorität des Benutzers ausgeführt werden, der die Prozedur aufruft.

      Beim Auflösen von Beziehungen und Routinen im Textkörper des Verfahrens verwendet Azure Databricks den aktuellen Katalog und das aktuelle Schema zum Zeitpunkt des Aufrufs.

      Sehen Sie sich autorisierte Benutzer und Sitzungsbenutzer an, wie sich der autorisierte Benutzer und der Sitzungsbenutzer innerhalb von Prozedurkörpern und über geschachtelte Anrufe verhalten.

    • SQL SECURITY DEFINER

      Gilt für:Grünes Häkchen für „Ja“ Databricks SQL

      Gibt an, dass alle SQL-Anweisungen im Textkörper der Prozedur immer unter der Autorität des Besitzers (Definer) der Prozedur ausgeführt werden, unabhängig davon, welcher Benutzer die Prozedur aufruft. Das heißt, der Besitzer ist der autorisierte Benutzer für den Textkörper. Der Aufrufer erfordert nur die EXECUTE Berechtigung für die Prozedur. Alle Zugriffsprüfungen für Beziehungen, Routinen und andere Objekte, auf die vom Textkörper verwiesen wird, werden für den autorisierten Benutzer ausgewertet.

      Beim Auflösen von Beziehungen und Routinen im Textkörper der Prozedur verwendet Azure Databricks den Katalog und das Schema, das zum Zeitpunkt der Erstellung der Prozedur aktuell war. Die sitzungsbezogenen Objekte des Aufrufers, z. B. temporäre Ansichten, temporäre Tabellen, Sitzungsvariablen und Sitzungsbereichsfunktionen, werden vom Auflösungssuchpfad im Textkörper ausgeschlossen, sodass sie nicht durch ihre nicht qualifizierten Namen referenziert werden können. Sie bleiben verfügbar, wenn mit dem session Schemaqualifizierer verwiesen wird, z session.object_name . B. oder system.session.object_name.

      SQL-Konfigurationen (z. B. die Standardzeitzone), die sich auf die Semantik von Anweisungen im Textkörper auswirken, ANSI_MODE werden ebenfalls zur Erstellungszeit erfasst und bei jedem Aufruf der Prozedur verwendet, unabhängig von den Sitzungseinstellungen des Aufrufs.

      Innerhalb eines SQL SECURITY DEFINER Textkörpers gibt current_catalog den Katalog zurück, der beim Erstellen der Prozedur aktuell war, und current_schema und current_database das Schema zurück, das beim Erstellen der Prozedur aktuell war.

      SQL SECURITY DEFINER ändert den Wert von session_user nicht: Er gibt weiterhin den Benutzer zurück, der die Datei CALLausgestellt hat. Lesen Sie autorisierten Benutzer und Sitzungsbenutzer , wie sich der autorisierte Benutzer und der Sitzungsbenutzer innerhalb eines SQL SECURITY DEFINER Textkörpers unterscheiden.

    • NICHT DETERMINISTISCH

      Eine Prozedur wird als nicht deterministisch angenommen, d. h. sie kann unterschiedliche Ergebnisse für jeden Aufruf zurückgeben, auch wenn sie mit denselben Argumenten aufgerufen wird.

    • PROZEDURKOMMENTAR

      Ein Kommentar zum Verfahren. procedure_comment muss literal sein STRING . Der Standardwert lautet NULL.

    • STANDARDKOLLATION default_collation_name

      Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime 17.1 and above

      Legt die Standardsortierung der Prozedur fest. Die Standardsortierung der Prozedur wird als Standardsortierung für Prozedurparameter, DEFAULT Ausdrücke für Parameter, typierte lokale Variablen verwendet, STRING die im Prozedurtext deklariert sind, und STRING Literale, die im Prozedurtext verwendet werden.

      In Databricks Runtime 17.1 bis Databricks Runtime 18.2 default_collation_name muss der Wert sein UTF8_BINARY. Diese Klausel ist obligatorisch, wenn das Schema, in dem die Prozedur erstellt wird, eine Standard-Zeichensortierung erhält, die von UTF8_BINARY abweicht.

      Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime 18 and above

      default_collation_name kann ein beliebiger unterstützter Sortierungsname sein.

      Wenn nicht angegeben, wird die Standardsortierung vom Schema abgeleitet, in dem die Prozedur erstellt wird.

    • ÄNDERT SQL-DATEN

      Es wird angenommen, dass eine Prozedur SQL-Daten ändert.

Häufige Fehlerbedingungen

Beispiele

-- Demonstrate INOUT and OUT parameter usage.
> CREATE OR REPLACE PROCEDURE add(x INT, y INT, OUT sum INT, INOUT total INT)
    LANGUAGE SQL
    SQL SECURITY INVOKER
    COMMENT 'Add two numbers'
    AS BEGIN
        SET sum = x + y;
        SET total = total + sum;
    END;
> DECLARE sum INT;
> DECLARE total INT DEFAULT 0;
> CALL add(1, 2, sum, total);
> SELECT sum, total;
 3 3
> CALL add(3, 4, sum, total);
 7 10

-- The last executed query is the result set of a procedure
> CREATE PROCEDURE greeting(IN mode STRING COMMENT 'informal or formal')
    LANGUAGE SQL
    SQL SECURITY INVOKER
    AS BEGIN
        SELECT 'Hello!';
        CASE mode WHEN 'informal' THEN SELECT 'Hi!';
                  WHEN 'formal' THEN SELECT 'Pleased to meet you.';
        END CASE;
    END;
> CALL greeting('informal');
  Hi!

> CALL greeting('formal');
  Pleased to meet you.

> CALL greeting('casual');
  Hello!

-- Use SQL SECURITY DEFINER so the procedure runs with the owner's privileges
-- and references its creation-time catalog and schema. The invoker only needs
-- EXECUTE on `audit_app.ops.log_event`; they do not need any privileges on the
-- underlying `audit_app.private.audit_log` table.
> USE CATALOG audit_app;
> USE SCHEMA ops;
> CREATE OR REPLACE PROCEDURE log_event(IN event STRING)
    LANGUAGE SQL
    SQL SECURITY DEFINER
    MODIFIES SQL DATA
    AS BEGIN
        INSERT INTO audit_app.private.audit_log
          VALUES (current_user(), current_catalog(), current_schema(), event);
    END;

-- Even when invoked from a different catalog/schema and by a different user,
-- the body still inserts into `audit_app.private.audit_log`, with
-- `current_catalog()` and `current_schema()` returning the values frozen at
-- creation time. `session_user()` is unaffected by `SQL SECURITY DEFINER`
-- and records the actual invoker -- which is what audit logs typically want.
> USE CATALOG sales;
> USE SCHEMA reports;
> CALL audit_app.ops.log_event('checkout_completed');