CRÉER PROCÉDURE

S'applique à :coche oui Databricks SQL Databricks Runtime 17.0 et versions ultérieures coche oui uniquement pour le catalogue Unity

Crée une procédure dans Le catalogue Unity qui accepte ou modifie des arguments, exécute un ensemble d’instructions SQL et retourne éventuellement un jeu de résultats.

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 }

Paramètres

  • OU REMPLACER

    Si elle est spécifiée, une procédure portant le même nom est remplacée. Vous ne pouvez pas remplacer une fonction existante par une procédure ; cela soulève ROUTINE_ALREADY_EXISTS. Vous ne pouvez pas spécifier ce paramètre avec IF NOT EXISTS; en spécifiant les deux déclenche INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • SI N'EXISTE PAS

    Si elle est spécifiée, crée la procédure uniquement lorsqu’une procédure portant ce nom n’existe pas déjà. Si une procédure portant le même nom existe, l’instruction est ignorée. Vous ne pouvez pas spécifier ce paramètre avec OR REPLACE; en spécifiant les deux déclenche INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Nom de la procédure. Vous pouvez éventuellement qualifier le nom de la procédure avec un nom de schéma. Si le nom n’est pas qualifié, la procédure permanente est créée dans le schéma actuel.

    Le nom de la procédure doit être unique pour toutes les routines (procédures et fonctions) dans le schéma. Si une routine portant le même nom n’existe ni n’est OR REPLACEIF NOT EXISTS spécifiée, Azure Databricks déclenche ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Spécifie un paramètre de la procédure.

    • parameter_name

      Le nom du paramètre doit être unique dans la procédure ; sinon, Azure Databricks déclenche DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT ou OUT

      Décrit éventuellement le mode du paramètre.

      • IN

        Définit un paramètre d’entrée uniquement. Il s’agit de la valeur par défaut.

      • INOUT

        Définit un paramètre qui accepte un argument d’entrée-sortie. Si la procédure se termine sans erreur non gérée, elle retourne la valeur finale du paramètre en tant que sortie.

      • DEHORS

        Définit un paramètre de sortie. Le paramètre est initialisé NULL et, si la procédure se termine sans erreur non gérée, elle retourne la valeur finale du paramètre en tant que sortie.

    • type_de_données

      Tout type de données pris en charge.

    • DEFAULT_EXPRESSION DEFAULT

      Valeur par défaut facultative à utiliser lorsqu’un appel de fonction n’affecte pas d’argument au paramètre. default_expression doit être convertible en une valeur de type data_type. L’expression ne doit pas faire référence à un autre paramètre ou contenir une sous-requête.

      Lorsque vous spécifiez une valeur par défaut pour un paramètre, tous les paramètres suivants doivent également avoir une valeur par défaut.

      DEFAULT n’est pas pris en charge pour ou pour OUT les INOUT paramètres ; la spécification d’un déclenche PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • COMMENT Commentaire

      Description optionnelle du paramètre. comment doit être un littéral STRING.

  • compound_statement

    Instruction composée SQL (BEGIN ... END) avec la définition de la procédure SQL.

    Lorsque la procédure est créée, la correction syntaxique est validée. Le corps de la procédure n’est pas validé pour la correction sémantique tant que la procédure n’est pas appelée.

  • caractéristique

    L’un ou l’autre SQL SECURITY INVOKERSQL SECURITY DEFINERest LANGUAGE SQL requis. Tous les autres sont facultatifs. Vous pouvez spécifier n’importe quel nombre de caractéristiques dans n’importe quel ordre, mais vous ne pouvez spécifier chaque clause qu’une seule fois.

    • LANGUAGE SQL

      Langage de l’implémentation de la fonction.

    • SQL SECURITY INVOKER

      Spécifie que toutes les instructions SQL dans le corps de la procédure seront exécutées sous l’autorité de l’utilisateur appelant la procédure.

      Lors de la résolution des relations et des routines dans le corps de la procédure, Azure Databricks utilise le catalogue actuel et le schéma actuel au moment de l’appel.

      Consultez l’utilisateur autorisé et l’utilisateur de session pour savoir comment l’utilisateur autorisé et l’utilisateur de session se comportent à l’intérieur des corps de procédure et entre les appels imbriqués.

    • SQL SECURITY DEFINER

      S’applique à :case cochée oui Databricks SQL

      Spécifie que toutes les instructions SQL dans le corps de la procédure sont toujours exécutées sous l’autorité du propriétaire (definer) de la procédure, quel que soit l’utilisateur qui appelle la procédure. Autrement dit, le propriétaire est l’utilisateur autorisé pour le corps. L’appelant requiert uniquement le EXECUTE privilège sur la procédure ; tous les contrôles d’accès sur les relations, routines et autres objets référencés à partir du corps sont évalués par rapport à l’utilisateur autorisé.

      Lors de la résolution des relations et des routines dans le corps de la procédure, Azure Databricks utilise le catalogue et le schéma qui étaient en cours au moment de la création de la procédure. Les objets d’étendue de session de l’appelant, tels que les vues temporaires, les tables temporaires, les variables de session et les fonctions délimitées à la session, sont exclus du chemin de recherche de résolution à l’intérieur du corps, de sorte qu’ils ne peuvent pas être référencés par leurs noms non qualifiés. Ils restent accessibles lorsqu’ils sont référencés avec le qualificateur de session schéma, par exemple session.object_name ou system.session.object_name.

      Les configurations SQL (par exemple, ANSI_MODE ou le fuseau horaire par défaut) qui affectent la sémantique des instructions dans le corps sont également capturées au moment de la création et utilisées pendant chaque appel de la procédure, quels que soient les paramètres de session de l’appelant.

      À l’intérieur d’un SQL SECURITY DEFINER corps, current_catalog retourne le catalogue en cours lors de la création de la procédure, et current_schema et current_database renvoyer le schéma actif lors de la création de la procédure.

      SQL SECURITY DEFINER ne modifie pas la valeur de session_user : elle continue de renvoyer l’utilisateur qui a émis le CALL. Consultez l’utilisateur autorisé et l’utilisateur de session pour savoir comment l’utilisateur autorisé et l’utilisateur de session diffèrent à l’intérieur d’un SQL SECURITY DEFINER corps.

    • NON DÉTERMINISTE

      Une procédure est supposée non déterministe, ce qui signifie qu’elle peut retourner des résultats différents sur chaque appel, même lorsqu’elle est appelée avec les mêmes arguments.

    • COMMENTAIRE procedure_comment

      Commentaire de la procédure. procedure_comment doit être STRING littéral. La valeur par défaut est NULL.

    • COLLATION PAR DÉFAUT default_collation_name

      S’applique à :check marqué oui Databricks SQL vérifié marqué oui Databricks Runtime 17.1 et versions ultérieures

      Définit le classement par défaut de la procédure. Le classement par défaut de la procédure est utilisé comme classement par défaut pour les paramètres de procédure, DEFAULT les expressions pour les paramètres, STRING les variables locales typées déclarées dans le corps de la procédure et STRING les littéraux utilisés dans le corps de la procédure.

      Dans Databricks Runtime 17.1 via Databricks Runtime 18.2, default_collation_name doit être UTF8_BINARY. Cette clause est obligatoire si le schéma dans lequel la procédure est créée a un classement par défaut autre que UTF8_BINARY.

      S’applique à :check marqué oui Databricks SQL , marqué oui Databricks Runtime 18 et versions ultérieures

      default_collation_name peut être n’importe quel nom de classement pris en charge.

      S’il n’est pas spécifié, le classement par défaut est dérivé du schéma dans lequel la procédure est créée.

    • MODIFIE LES DONNÉES SQL

      Une procédure est supposée modifier les données SQL.

Conditions d’erreur courantes

Exemples

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