VYTVOŘENÍ POSTUPU

Platí pro:zaškrtnuto ano Databricks SQL Databricks Runtime 17.0 a vyšší zaškrtnuto pouze ano Databricks Unity Catalog

Vytvoří proceduru v katalogu Unity, která přebírá nebo upravuje argumenty, spouští sadu příkazů SQL a volitelně vrací sadu výsledků.

Syntaxe

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 }

Parametry

  • NEBO NAHRAĎTE

    Pokud je zadáno, nahradí se procedura stejného názvu. Existující funkci nelze nahradit postupem; tím se zvýší ROUTINE_ALREADY_EXISTS. Tento parametr IF NOT EXISTSnelze zadat pomocí parametru ; zadáním obou vyvolá INVALID_SQL_SYNTAX . CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • POKUD NEEXISTUJE

    Pokud je zadán, vytvoří proceduru pouze v případě, že procedura s tímto názvem ještě neexistuje. Pokud existuje procedura se stejným názvem, příkaz se ignoruje. Tento parametr OR REPLACEnelze zadat pomocí parametru ; zadáním obou vyvolá INVALID_SQL_SYNTAX . CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Název procedury. Volitelně můžete kvalifikovat název procedury názvem schématu. Pokud název není kvalifikovaný, vytvoří se v aktuálním schématu trvalá procedura.

    Název procedury musí být jedinečný pro všechny rutiny (procedury a funkce) ve schématu. Pokud existuje rutina se stejným názvem a OR REPLACE není zadána ani IF NOT EXISTS zadaná, Azure Databricks vyvolá ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Určuje parametr procedury.

    • parameter_name

      Název parametru musí být v rámci postupu jedinečný; jinak Azure Databricks vyvolá DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT nebo OUT

      Volitelně popisuje režim parametru.

      • V

        Definuje parametr pouze vstupní. Toto je výchozí hodnota.

      • INOUT

        Definuje parametr, který přijímá argument input-output. Pokud se procedura dokončí bez neošetřené chyby, vrátí jako výstup konečnou hodnotu parametru.

      • VEN

        Definuje výstupní parametr. Parametr se inicializuje NULL a pokud se procedura dokončí bez neošetřené chyby, vrátí jako výstup konečnou hodnotu parametru.

    • datový_typ

      Libovolný podporovaný datový typ.

    • VÝCHOZÍ default_expression

      Volitelné výchozí nastavení, které se má použít, když vyvolání funkce nepřiřazuje argument parametru. default_expression musí být přetypovatelný nadata_type. Výraz nesmí odkazovat na jiný parametr ani obsahovat poddotaz.

      Pokud zadáte výchozí hodnotu pro jeden parametr, musí mít všechny následující parametry také výchozí hodnotu.

      parametr /> zadání jednoho vyvolá PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • KOMENTÁŘ

      Volitelný popis parametru. comment musí být STRING literál.

  • složený_výrok

    Složený příkaz SQL (BEGIN ... END) s definicí procedury SQL.

    Po vytvoření procedury se ověří její syntaktická správnost. Tělo procedury není ověřeno pro sémantickou správnost, dokud se nevyvolá procedura.

  • charakteristický

    Jedna z SQL SECURITY INVOKER nebo SQL SECURITY DEFINERa LANGUAGE SQL jsou povinná. Všechny ostatní jsou volitelné. Můžete zadat libovolný počet charakteristik v libovolném pořadí, ale každou klauzuli můžete zadat pouze jednou.

    • JAZYK SQL

      Jazyk implementace funkce.

    • VYVOLÁNÍ ZABEZPEČENÍ SQL

      Určuje, že všechny příkazy SQL v těle procedury budou provedeny pod autoritou uživatele vyvolání procedury.

      Při řešení relací a rutin v těle procedury Azure Databricks používá aktuální katalog a aktuální schéma v době vyvolání.

      Informace o chování autorizovaného uživatele a uživatele relace v těle procedury a vnořených voláních najdete v části Autorizovaný uživatel a uživatel relace .

    • DEFINICE ZABEZPEČENÍ SQL

      Platí pro:označeno jako „ano“ Databricks SQL

      Určuje, že všechny příkazy SQL v těle procedury se vždy provádějí pod autoritou vlastníka (definer) procedury bez ohledu na to, který uživatel vyvolá proceduru. To znamená, že vlastník je autorizovaným uživatelem pro tělo. Invoker vyžaduje EXECUTE pouze oprávnění pro proceduru. Všechny kontroly přístupu pro vztahy, rutiny a další objekty odkazované z těla se vyhodnocují vůči autorizovanému uživateli.

      Při řešení relací a rutin v těle procedury Azure Databricks používá katalog a schéma, které byly aktuální v době vytvoření procedury. Objekty v oboru relace invokeru, jako jsou dočasná zobrazení, dočasné tabulky, proměnné relace a funkce s oborem relace, jsou vyloučeny z cesty hledání překladu uvnitř těla, takže na tyto objekty nelze odkazovat jejich nekvalifikovanými názvy. Zůstanou přístupné, pokud jsou odkazovány pomocí kvalifikátoru session schématu, například session.object_namesystem.session.object_name.

      Konfigurace SQL (například výchozí časové pásmo), které ovlivňují sémantiku příkazů v těle, ANSI_MODE se zachytávají také při vytváření a používají se při každém vyvolání procedury bez ohledu na nastavení relace invokeru.

      V těle SQL SECURITY DEFINERcurrent_catalog vrátí katalog, který byl aktuální při vytvoření procedury, a current_schema a current_database vrátit schéma, které bylo aktuální při vytvoření procedury.

      SQL SECURITY DEFINER nezmění hodnotu session_user: bude nadále vracet uživatele, který vydal CALL. Informace o tom, jak se autorizovaný uživatel a uživatel relace liší v těleSQL SECURITY DEFINER, najdete v části Autorizovaný uživatel a uživatel relace.

    • NEDETERMINISTICKÝ

      Procedura se předpokládá nedeterministicky, což znamená, že při každém vyvolání může vracet různé výsledky, i když je volána se stejnými argumenty.

    • PROCEDURA_KOMENTÁŘ

      Komentář k postupu. procedure_comment musí být STRING literál. Výchozí hodnota je NULL.

    • výchozí kolace default_collation_name

      Platí pro:check označený jako ano Kontrola SQL Databricks označená jako ano Databricks Runtime 17.1 a vyšší

      Nastaví výchozí kolaci procedury. Výchozí kolace procedury se používá jako výchozí kolace pro parametry procedury, výrazy pro parametry, DEFAULTSTRING zadané místní proměnné deklarované v těle procedury a STRING literály použité v těle procedury.

      V Databricks Runtime 17.1 prostřednictvím Databricks Runtime 18.2 default_collation_name musí být UTF8_BINARY. Tato klauzule je povinná, pokud schéma, ve kterém je procedura vytvořena, má jinou výchozí kolaci než UTF8_BINARY.

      Platí pro:check marked yes Databricks SQL check marked yes Databricks Runtime 18 a vyšší

      default_collation_name může být libovolný podporovaný název kolace.

      Pokud není zadáno, výchozí kolace je odvozena ze schématu, ve kterém je procedura vytvořena.

    • UPRAVÍ DATA SQL.

      Předpokládá se, že se jedná o úpravu dat SQL.

Běžné chybové podmínky

Příklady

-- 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');