Aanmaken van procedure

Van toepassing op:aangevinkt ja Databricks SQL Databricks Runtime 17.0 en hoger aangevinkt ja alleen Unity Catalog

Hiermee maakt u een procedure in Unity Catalog die argumenten gebruikt of wijzigt, een set SQL-instructies uitvoert en eventueel een resultatenset retourneert.

Syntaxis

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 }

Parameterwaarden

  • OF VERVANGEN

    Indien opgegeven, wordt een procedure met dezelfde naam vervangen. U kunt een bestaande functie niet vervangen door een procedure; Als u dit doet, verhoogt u ROUTINE_ALREADY_EXISTS. U kunt deze parameter niet opgeven met IF NOT EXISTS; als u beide verhogingen opgeeft INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • ALS NIET BESTAAT

    Indien opgegeven, wordt de procedure alleen gemaakt wanneer er nog geen procedure met die naam bestaat. Als er een procedure met dezelfde naam bestaat, wordt de statement genegeerd. U kunt deze parameter niet opgeven met OR REPLACE; als u beide verhogingen opgeeft INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Een naam voor de procedure. U kunt desgewenst de naam van de procedure kwalificeren met een schemanaam. Als de naam niet is gekwalificeerd, wordt de permanente procedure gemaakt in het huidige schema.

    De naam van de procedure moet uniek zijn voor alle routines (procedures en functies) in het schema. Als er een routine met dezelfde naam bestaat en noch OR REPLACEIF NOT EXISTS wordt opgegeven, wordt Azure Databricks ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Hiermee geeft u een parameter van de procedure.

    • parameter_name

      De parameternaam moet uniek zijn binnen de procedure; anders verhoogt Azure Databricks DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT of OUT

      Beschrijft eventueel de modus van de parameter.

      • IN

        Hiermee definieert u een invoerparameter die alleen als invoer dient. Dit is de standaardwaarde.

      • INOUT

        Hiermee definieert u een parameter die een invoer-uitvoerargument accepteert. Als de procedure is voltooid zonder een niet-verwerkte fout, wordt de uiteindelijke parameterwaarde als uitvoer geretourneerd.

      • BUITEN

        Hiermee definieert u een uitvoerparameter. De parameter wordt geïnitialiseerd met NULL en, als de procedure zonder een niet-verwerkte fout wordt voltooid, zal de uiteindelijke parameterwaarde als uitvoer worden geretourneerd.

    • data_type

      Elk ondersteund gegevenstype.

    • STANDAARD default_expression

      Een optionele standaardwaarde die moet worden gebruikt wanneer een functieaanroep geen argument toewijst aan de parameter. default_expression moet worden gegoten naar data_type. De expressie mag niet verwijzen naar een andere parameter of een subquery bevatten.

      Wanneer u een standaardwaarde voor één parameter opgeeft, moeten alle volgende parameters ook een standaardwaarde hebben.

      DEFAULT wordt niet ondersteund voor OUT of INOUT parameters; als u één opgeeft, wordt PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • OPMERKING opmerking

      Een optionele beschrijving van de parameter. comment moet een STRING letterlijke waarde zijn.

  • samengestelde_verklaring

    Een samengestelde SQL-instructie (BEGIN ... END) met de definitie van de SQL-procedure.

    Wanneer de procedure wordt aangemaakt, wordt de syntactische juistheid gevalideerd. De hoofdtekst van de procedure wordt pas gevalideerd op semantische juistheid als de procedure wordt aangeroepen.

  • karakteristiek

    Een van SQL SECURITY INVOKER of SQL SECURITY DEFINER, en LANGUAGE SQL zijn vereist. Alle andere zijn optioneel. U kunt in elke volgorde een willekeurig aantal kenmerken opgeven, maar u kunt elke component slechts één keer opgeven.

    • LANGUAGE SQL

      De taal van de functie-implementatie.

    • SQL SECURITY INVOKER

      Hiermee geeft u op dat sql-instructies in de hoofdtekst van de procedure worden uitgevoerd onder de autoriteit van de gebruiker die de procedure aanroept.

      Bij het oplossen van relaties en routines binnen de hoofdtekst van de procedure gebruikt Azure Databricks de huidige catalogus en het huidige schema op het moment van aanroepen.

      Zie Geautoriseerde gebruiker en sessiegebruiker voor hoe de geautoriseerde gebruiker en de sessiegebruiker zich gedragen binnen procedureteksten en in geneste aanroepen.

    • SQL SECURITY DEFINER

      Van toepassing op:aangevinkt als ja Databricks SQL

      Hiermee geeft u op dat sql-instructies in de hoofdtekst van de procedure altijd worden uitgevoerd onder de autoriteit van de eigenaar (definer) van de procedure, ongeacht welke gebruiker de procedure aanroept. Dat wil gezegd, de eigenaar is de geautoriseerde gebruiker voor de hoofdtekst. De aanroeper vereist alleen de EXECUTE bevoegdheid voor de procedure. Alle toegangscontroles op relaties, routines en andere objecten waarnaar wordt verwezen vanuit de hoofdtekst, worden geëvalueerd op basis van de geautoriseerde gebruiker.

      Bij het oplossen van relaties en routines binnen de hoofdtekst van de procedure gebruikt Azure Databricks de catalogus en het schema die actueel waren op het moment dat de procedure werd gemaakt. De sessiebereikobjecten van de aanroeper, zoals tijdelijke weergaven, tijdelijke tabellen, sessievariabelen en sessiebereikfuncties, worden uitgesloten van het zoekpad voor resolutie in de hoofdtekst, zodat ze niet kunnen worden verwezen door hun niet-gekwalificeerde namen. Ze blijven toegankelijk wanneer er bijvoorbeeld session.object_name naar wordt verwezen met de session schemascheidingstekens of system.session.object_name.

      SQL-configuraties (bijvoorbeeld ANSI_MODE of de standaardtijdzone) die van invloed zijn op de semantiek van instructies in de hoofdtekst, worden ook vastgelegd tijdens het maken en worden gebruikt tijdens elke aanroep van de procedure, ongeacht de sessie-instellingen van de aanroeper.

      In een SQL SECURITY DEFINER hoofdtekst retourneert current_catalog de catalogus die actueel was toen de procedure werd gemaakt, en current_schema en current_database het schema retourneren dat actueel was toen de procedure werd gemaakt.

      SQL SECURITY DEFINER wijzigt de waarde van session_user niet: het blijft de gebruiker retourneren die de CALL. Zie Gemachtigde gebruiker en sessiegebruiker voor hoe de geautoriseerde gebruiker en de sessiegebruiker verschillen binnen een SQL SECURITY DEFINER hoofdtekst.

    • NIET DETERMINISTISCH

      Een procedure wordt verondersteld niet-deterministisch, wat betekent dat deze verschillende resultaten kan retourneren bij elke aanroep, zelfs wanneer deze wordt aangeroepen met dezelfde argumenten.

    • OPMERKING procedure_comment

      Een opmerking voor de procedure. procedure_comment moet letterlijk zijn STRING . De standaardwaarde is NULL.

    • STANDAARDCOLLATIE default_collation_name

      Van toepassing op:controleren gemarkeerd ja Databricks SQL-controle gemarkeerd als ja Databricks Runtime 17.1 en hoger

      Hiermee stelt u de standaardsortering van de procedure in. De standaardsortering van de procedure wordt gebruikt als de standaardsortering voor procedureparameters, DEFAULT expressies voor parameters, STRING getypte lokale variabelen die zijn gedeclareerd in de hoofdtekst van de procedure en STRING letterlijke waarden die worden gebruikt in de hoofdtekst van de procedure.

      In Databricks Runtime 17.1 tot en met Databricks Runtime 18.2 default_collation_name moet dit zijn UTF8_BINARY. Deze component is verplicht als het schema waarin de procedure wordt gemaakt, een andere standaardsortering heeft dan UTF8_BINARY.

      Van toepassing op:controleren gemarkeerd ja Databricks SQL-controle gemarkeerd als ja Databricks Runtime 18 en hoger

      default_collation_name kan elke ondersteunde sorteringsnaam zijn.

      Als dit niet is opgegeven, wordt de standaardsortering afgeleid van het schema waarin de procedure wordt gemaakt.

    • WIJZIGT SQL-GEGEVENS

      Er wordt uitgegaan van een procedure om SQL-gegevens te wijzigen.

Algemene foutvoorwaarden

Voorbeelden

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