Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S'applique à :
Databricks SQL Databricks Runtime 17.0 et versions ultérieures
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.-
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 EXISTSspécifiée, Azure Databricks déclenche ROUTINE_ALREADY_EXISTS. procedure_parameter
Spécifie un paramètre de la procédure.
-
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é
NULLet, si la procédure se termine sans erreur non gérée, elle retourne la valeur finale du paramètre en tant que sortie.
-
Tout type de données pris en charge.
-
Valeur par défaut facultative à utiliser lorsqu’un appel de fonction n’affecte pas d’argument au paramètre.
default_expressiondoit être convertible en une valeur de typedata_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.
DEFAULTn’est pas pris en charge pour ou pourOUTlesINOUTparamètres ; la spécification d’un déclenche PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT. COMMENT Commentaire
Description optionnelle du paramètre.
commentdoit être un littéralSTRING.
-
-
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 DEFINERestLANGUAGE SQLrequis. 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 à :
Databricks SQLSpé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
EXECUTEprivilè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
sessionschéma, par exemplesession.object_nameousystem.session.object_name.Les configurations SQL (par exemple,
ANSI_MODEou 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 DEFINERcorps, 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 DEFINERne modifie pas la valeur de session_user : elle continue de renvoyer l’utilisateur qui a émis leCALL. 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’unSQL SECURITY DEFINERcorps.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_commentdoit êtreSTRINGlittéral. La valeur par défaut estNULL.COLLATION PAR DÉFAUT default_collation_name
S’applique à :
Databricks SQL
Databricks Runtime 17.1 et versions ultérieuresDé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,
DEFAULTles expressions pour les paramètres,STRINGles variables locales typées déclarées dans le corps de la procédure etSTRINGles littéraux utilisés dans le corps de la procédure.Dans Databricks Runtime 17.1 via Databricks Runtime 18.2,
default_collation_namedoit êtreUTF8_BINARY. Cette clause est obligatoire si le schéma dans lequel la procédure est créée a un classement par défaut autre queUTF8_BINARY.S’applique à :
Databricks SQL
Databricks Runtime 18 et versions ultérieuresdefault_collation_namepeut ê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
- DUPLICATE_CLAUSES
- DUPLICATE_ROUTINE_PARAMETER_NAMES
- INVALID_DEFAULT_VALUE
- INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE
- MISSING_CLAUSES_FOR_OPERATION
- PROCEDURE_CREATION_EMPTY_ROUTINE
- PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT
- PROCEDURE_NOT_SUPPORTED
- PROCEDURE_NOT_SUPPORTED_WITH_HMS
- ROUTINE_ALREADY_EXISTS
- COLLATION_PROCÉDURE_NON_PRIS_EN_CHARGE
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');