Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
Databricks SQL Databricks Runtime 17.0 en hoger
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.-
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 EXISTSwordt opgegeven, wordt Azure Databricks ROUTINE_ALREADY_EXISTS. procedure_parameter
Hiermee geeft u een parameter van de procedure.
-
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
NULLen, als de procedure zonder een niet-verwerkte fout wordt voltooid, zal de uiteindelijke parameterwaarde als uitvoer worden geretourneerd.
-
Elk ondersteund gegevenstype.
STANDAARD default_expression
Een optionele standaardwaarde die moet worden gebruikt wanneer een functieaanroep geen argument toewijst aan de parameter.
default_expressionmoet worden gegoten naardata_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.
DEFAULTwordt niet ondersteund voorOUTofINOUTparameters; als u één opgeeft, wordt PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.OPMERKING opmerking
Een optionele beschrijving van de parameter.
commentmoet eenSTRINGletterlijke waarde zijn.
-
-
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 INVOKERofSQL SECURITY DEFINER, enLANGUAGE SQLzijn 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:
Databricks SQLHiermee 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
EXECUTEbevoegdheid 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_namenaar wordt verwezen met desessionschemascheidingstekens ofsystem.session.object_name.SQL-configuraties (bijvoorbeeld
ANSI_MODEof 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 DEFINERhoofdtekst 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 DEFINERwijzigt de waarde van session_user niet: het blijft de gebruiker retourneren die deCALL. Zie Gemachtigde gebruiker en sessiegebruiker voor hoe de geautoriseerde gebruiker en de sessiegebruiker verschillen binnen eenSQL SECURITY DEFINERhoofdtekst.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_commentmoet letterlijk zijnSTRING. De standaardwaarde isNULL.STANDAARDCOLLATIE default_collation_name
Van toepassing op:
Databricks
Databricks Runtime 17.1 en hogerHiermee stelt u de standaardsortering van de procedure in. De standaardsortering van de procedure wordt gebruikt als de standaardsortering voor procedureparameters,
DEFAULTexpressies voor parameters,STRINGgetypte lokale variabelen die zijn gedeclareerd in de hoofdtekst van de procedure enSTRINGletterlijke waarden die worden gebruikt in de hoofdtekst van de procedure.In Databricks Runtime 17.1 tot en met Databricks Runtime 18.2
default_collation_namemoet dit zijnUTF8_BINARY. Deze component is verplicht als het schema waarin de procedure wordt gemaakt, een andere standaardsortering heeft danUTF8_BINARY.Van toepassing op:
Databricks
Databricks Runtime 18 en hogerdefault_collation_namekan 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
- 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
- UNSUPPORTED_PROCEDURE_COLLATION
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');