LAGRA PROCEDUR

Gäller för:markerad ja Databricks SQL Databricks Runtime 17.0 och senare markerad ja Endast Unity Catalog

Skapar en procedur i Unity Catalog som tar eller ändrar argument, kör en uppsättning SQL-instruktioner och eventuellt returnerar en resultatuppsättning.

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 }

Parameterar

  • ELLER ERSÄTT MED

    Om det anges ersätts en procedur med samma namn. Du kan inte ersätta en befintlig funktion med en procedur. detta ger upphov till ROUTINE_ALREADY_EXISTS. Du kan inte ange den här parametern med IF NOT EXISTS. Om du anger båda genererar INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • OM DET INTE FINNS

    Om det anges skapar du endast proceduren när en procedur med det namnet inte redan finns. Om det finns en procedur med samma namn ignoreras instruktionen. Du kan inte ange den här parametern med OR REPLACE. Om du anger båda genererar INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Ett namn på proceduren. Du kan också kvalificera procedurnamnet med ett schemanamn. Om namnet inte är kvalificerat skapas den permanenta proceduren i det aktuella schemat.

    Procedurnamnet måste vara unikt för alla rutiner (procedurer och funktioner) i schemat. Om det finns en rutin med samma namn och varken OR REPLACE eller IF NOT EXISTS anges Azure Databricks genererar ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Anger en parameter för proceduren.

    • parameter_name

      Parameternamnet måste vara unikt i proceduren. annars ökar Azure Databricks DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT eller OUT

      Du kan också beskriva parameterns läge.

      • I

        Definierar enbart en indataparameter. Det här är standardinställningen.

      • INOUT

        Definierar en parameter som accepterar ett argument för indatautdata. Om proceduren slutförs utan ett ohanterat fel returneras det slutliga parametervärdet som utdata.

      • UT

        Definierar en utdataparameter. Parametern initieras till NULL och om proceduren slutförs utan ett ohanterat fel returneras det slutliga parametervärdet som utdata.

    • datatyp

      Alla datatyper som stöds.

    • FÖRVAL default_expression

      Ett valfritt standardvärde som ska användas när ett funktionsanrop inte tilldelar ett argument till parametern. default_expression måste kunna typkonverteras till data_type. Uttrycket får inte referera till en annan parameter eller innehålla en underfråga.

      När du anger ett standardvärde för en parameter måste alla följande parametrar också ha ett standardvärde.

      DEFAULT stöds inte för OUT eller INOUT parametrar. Om du anger en genereras PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • KOMMENTAR

      En valfri beskrivning av parametern. comment måste vara ett STRING literalvärde.

  • sammansatt_uttalande

    En SQL-sammansatt sats (BEGIN ... END) med definitionen av SQL-proceduren.

    När proceduren skapas valideras syntaktisk korrekthet. Procedurens brödtext verifieras inte för semantisk korrekthet förrän proceduren anropas.

  • karakteristik

    En av SQL SECURITY INVOKER eller SQL SECURITY DEFINER, och LANGUAGE SQL krävs. Alla andra är valfria. Du kan ange valfritt antal egenskaper i valfri ordning, men du kan bara ange varje sats en gång.

    • LANGUAGE SQL

      Språket för funktionsimplementeringen.

    • SQL SECURITY INVOKER

      Anger att alla SQL-instruktioner i procedurens brödtext ska köras under överinseende av den användare som anropar proceduren.

      När du löser relationer och rutiner i procedurens brödtext använder Azure Databricks den aktuella katalogen och det aktuella schemat vid tidpunkten för anropet.

      Se Behörig användare och sessionsanvändare för hur den auktoriserade användaren och sessionsanvändaren beter sig i procedurer och över kapslade anrop.

    • SQL SECURITY DEFINER

      Gäller för:markerad ja Databricks SQL

      Anger att alla SQL-instruktioner i procedurens brödtext alltid körs under överinseende av ägaren (definieraren) för proceduren, oavsett vilken användare som anropar proceduren. Ägaren är alltså den behöriga användaren för brödtexten. Anroparen kräver endast behörigheten EXECUTE för proceduren. Alla åtkomstkontroller av relationer, rutiner och andra objekt som refereras från brödtexten utvärderas mot den behöriga användaren.

      När du löser relationer och rutiner i procedurens brödtext använder Azure Databricks katalogen och schemat som var aktuella när proceduren skapades. Anroparens sessionsomfångsobjekt, till exempel tillfälliga vyer, tillfälliga tabeller, sessionsvariabler och funktioner med sessionsomfattning, undantas från sökvägen för lösningssökning i brödtexten, så att de inte kan refereras till av deras okvalificerade namn. De förblir tillgängliga när de session refereras till med schemakvalificeraren, till exempel session.object_name eller system.session.object_name.

      SQL-konfigurationer (till exempel ANSI_MODE eller standardtidszonen) som påverkar semantiken för instruktioner i brödtexten samlas också in vid skapandetillfället och används under varje anrop av proceduren, oavsett anroparens sessionsinställningar.

      I en SQL SECURITY DEFINER brödtext returnerar current_catalog katalogen som var aktuell när proceduren skapades och current_schema och current_database returnera det schema som var aktuellt när proceduren skapades.

      SQL SECURITY DEFINER ändrar inte värdet för session_user: det fortsätter att returnera användaren som utfärdade CALL. Se Behörig användare och sessionsanvändare för hur den behöriga användaren och sessionsanvändaren skiljer sig åt i en SQL SECURITY DEFINER brödtext.

    • INTE DETERMINISTISK

      En procedur antas vara icke-terministisk, vilket innebär att den kan returnera olika resultat för varje anrop, även när den anropas med samma argument.

    • KOMMENTAR procedure_comment

      En kommentar till proceduren. procedure_comment måste vara STRING bokstavlig. Standardvärdet är NULL.

    • STANDARDSORTERING default_collation_name

      Gäller för:check markerad ja Databricks SQL-kontroll markerad ja Databricks Runtime 17.1 och senare

      Anger standardsortering av proceduren. Standardsortering av proceduren används som standardsortering för procedureparametrar, DEFAULT uttryck för parametrar, STRING inskrivna lokala variabler som deklarerats i procedurtexten och STRING literaler som används i procedurens brödtext.

      I Databricks Runtime 17.1 till Databricks Runtime 18.2 default_collation_name måste vara UTF8_BINARY. Den här satsen är obligatorisk om schemat där proceduren skapas har en annan standardsortering än UTF8_BINARY.

      Gäller för:check markerad ja Databricks SQL-kontroll markerad ja Databricks Runtime 18 och senare

      default_collation_name kan vara valfritt sorteringsnamn som stöds.

      Om den inte anges härleds standardsortering från schemat där proceduren skapas.

    • ÄNDRAR SQL DATA

      En procedur antas ändra SQL-data.

Vanliga felvillkor

Exempel

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