AZ ELJÁRÁS LÉTREHOZÁSA

A következőkre vonatkozik:igen bejelölve a Databricks SQL Databricks Runtime 17.0 és újabb igen bejelölve csak Unity Catalog esetén

Létrehoz egy eljárást a Unity Katalógusban, amely argumentumokat vesz fel vagy módosít, SQL-utasítások készletét hajtja végre, és opcionálisan eredményhalmazt ad vissza.

Szemantika

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 }

Paraméterek

  • CSERÉLJE LE

    Ha meg van adva, az azonos nevű eljárás helyébe lép. A meglévő függvények nem helyettesíthetők eljárásokkal; ezzel ROUTINE_ALREADY_EXISTS. Ezt a paramétert IF NOT EXISTSnem adhatja meg ; mindkét emelés INVALID_SQL_SYNTAX megadásával . CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • HA NEM LÉTEZIK

    Ha meg van adva, csak akkor hozza létre az eljárást, ha egy ilyen nevű eljárás még nem létezik. Ha létezik egy azonos nevű eljárás, a rendszer figyelmen kívül hagyja az utasítást. Ezt a paramétert OR REPLACEnem adhatja meg ; mindkét emelés INVALID_SQL_SYNTAX megadásával . CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Az eljárás neve. Az eljárás nevét igény szerint sémanévvel is minősítheti. Ha a név nincs minősítve, az állandó eljárás az aktuális sémában jön létre.

    Az eljárás nevének egyedinek kell lennie a séma összes rutinja (eljárása és függvénye) esetében. Ha egy azonos nevű rutin létezik, és nincs megadvaOR REPLACE, IF NOT EXISTS Azure Databricks ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Az eljárás paraméterét adja meg.

    • parameter_name

      A paraméter nevének egyedinek kell lennie az eljáráson belül; ellenkező esetben Azure Databricks DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT vagy OUT

      Opcionálisan a paraméter módját írja le.

      • BEN

        Csak bemeneti paramétert határoz meg. Ez az alapértelmezett érték.

      • INOUT

        Egy bemeneti-kimeneti argumentumot elfogadó paramétert határoz meg. Ha az eljárás kezeletlen hiba nélkül fejeződik be, kimenetként a végső paraméterértéket adja vissza.

      • KI

        Kimeneti paramétert határoz meg. A paraméter inicializálva NULL van, és ha az eljárás kezeletlen hiba nélkül fejeződik be, a végső paraméterértéket kimenetként adja vissza.

    • adat_típus

      Bármilyen támogatott adattípus.

    • ALAPÉRTELMEZETT default_expression

      Nem kötelező alapértelmezett érték, amelyet akkor kell használni, ha egy függvényhívás nem rendel argumentumot a paraméterhez. default_expression paraméternek rendelhetőnek kell lennie típussá data_type. A kifejezés nem hivatkozhat másik paraméterre, és nem tartalmazhat al lekérdezést.

      Ha egy paraméterhez alapértelmezett értéket ad meg, az alábbi paramétereknek is alapértelmezettnek kell lenniük.

      DEFAULT nem támogatottak OUT vagy INOUT paraméterek; az egyik megadása PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • Megjegyzés megjegyzés

      A paraméter opcionális leírása. comment egy literál kell, hogy legyen STRING.

  • összetett_kifejezés

    Sql-összetett utasítás (BEGIN ... END) az SQL-eljárás definíciójával.

    Az eljárás létrehozásakor a rendszer ellenőrzi a szintaktikai helyességet. Az eljárás törzsének szemantikai helyességét nem ellenőrzik, amíg meg nem hívják az eljárást.

  • jellemző

    Az egyik SQL SECURITY INVOKER vagy SQL SECURITY DEFINER, és LANGUAGE SQL kötelező. A többi nem kötelező. Tetszőleges számú jellemzőt tetszőleges sorrendben megadhatja, de mindegyik záradékot csak egyszer adhatja meg.

    • LANGUAGE SQL

      A függvény implementálásának nyelve.

    • SQL SECURITY INVOKER

      Megadja, hogy az eljárás törzsében található SQL-utasítások az eljárást megadó felhasználó felügyelete alatt legyenek végrehajtva.

      Az eljárás törzsén belüli kapcsolatok és rutinok feloldásakor Azure Databricks az aktuális katalógust és az aktuális sémát használja a meghívás idején.

      Az engedélyezett felhasználó és a munkamenet-felhasználó hogyan viselkedik az eljárástörzsekben és a beágyazott hívásokban.

    • SQL SECURITY DEFINER

      A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL

      Meghatározza, hogy az eljárás törzsében található SQL-utasítások mindig az eljárás tulajdonosának (definiálójának) felügyelete alatt legyenek végrehajtva, függetlenül attól, hogy melyik felhasználó hívja meg az eljárást. Vagyis a tulajdonos a szervezet jogosult felhasználója . A meghívó csak az EXECUTE eljáráshoz szükséges jogosultságot igényli; a rendszer kiértékeli a törzsből hivatkozott kapcsolatok, rutinok és egyéb objektumok hozzáférés-ellenőrzését a jogosult felhasználóval szemben.

      Az eljárás törzsén belüli kapcsolatok és rutinok feloldásakor Azure Databricks az eljárás létrehozásakor aktuális katalógust és sémát használja. A meghívó munkamenet-hatókörű objektumai, például az ideiglenes nézetek, az ideiglenes táblák, a munkamenet-változók és a munkamenet-hatókörű függvények ki vannak zárva a feloldási keresési útvonalból a törzsen belül, így nem hivatkozhatnak rájuk a nem minősített neveik. A séma-minősítővel session való hivatkozáskor például elérhetők maradnak.session.object_namesystem.session.object_name

      Az SQL-konfigurációk (például az alapértelmezett időzóna), amelyek befolyásolják a törzsben lévő utasítások szemantikáját, ANSI_MODE a létrehozáskor is rögzítve lesznek, és az eljárás minden meghívása során használhatók, függetlenül az meghívó munkamenet-beállításaitól.

      Egy SQL SECURITY DEFINERtörzsben current_catalog az eljárás létrehozásakor aktuális katalógust adja vissza, és current_schema és current_database az eljárás létrehozásakor aktuális sémát adja vissza.

      SQL SECURITY DEFINER nem módosítja a session_user értékét: továbbra is visszaadja azt a felhasználót, aki a CALL. Az engedélyezett felhasználó és a munkamenet-felhasználó különbségét a törzsön belül tekinti meg SQL SECURITY DEFINER .

    • NEM MEGHATÁROZOTT

      Az eljárás nemdeterminisztikusnak minősül, ami azt jelenti, hogy az egyes meghívások különböző eredményeket adhatnak vissza, még akkor is, ha ugyanazokkal az argumentumokkal hívják meg.

    • MEGJEGYZÉS procedure_comment

      Megjegyzés az eljáráshoz. procedure_comment kell, hogy STRING literál legyen. Az alapértelmezett érték a NULL.

    • ALAPÉRTELMEZETT BETŰREND default_collation_name

      A következőre vonatkozik:yes Databricks SQL check mark yes Databricks Runtime 17.1 és újabb

      Beállítja az eljárás alapértelmezett rendezést. Az eljárás alapértelmezett rendezése az eljárásparaméterek, a paraméterek kifejezései, DEFAULTSTRING az eljárástörzsben deklarált beírt helyi változók és STRING az eljárástörzsben használt literálok alapértelmezett rendezése.

      A Databricks Runtime 17.1-ben a Databricks Runtime 18.2-nek default_collation_name kell lennie UTF8_BINARY. Ez a záradék kötelező, ha az eljárás alapjául szolgáló séma nem alapértelmezett rendezéssel UTF8_BINARYrendelkezik.

      A következőre vonatkozik:yes Databricks SQL check mark yes Databricks Runtime 18 vagy újabb

      default_collation_name bármely támogatott rendezési név lehet.

      Ha nincs megadva, az alapértelmezett rendezés abból a sémából származik, amelyben az eljárás létrejön.

    • SQL-ADATOK MÓDOSÍTÁSA

      A rendszer feltételezi, hogy egy eljárás módosítja az SQL-adatokat.

Gyakori hibafeltételek

Példák

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