Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:
Databricks SQL Databricks Runtime 17.0 och senare
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.-
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 REPLACEellerIF NOT EXISTSanges Azure Databricks genererar ROUTINE_ALREADY_EXISTS. procedure_parameter
Anger en parameter för proceduren.
-
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
NULLoch om proceduren slutförs utan ett ohanterat fel returneras det slutliga parametervärdet som utdata.
-
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_expressionmåste kunna typkonverteras tilldata_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.
DEFAULTstöds inte förOUTellerINOUTparametrar. Om du anger en genereras PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.KOMMENTAR
En valfri beskrivning av parametern.
commentmåste vara ettSTRINGliteralvärde.
-
-
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 INVOKERellerSQL SECURITY DEFINER, ochLANGUAGE SQLkrä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:
Databricks SQLAnger 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
EXECUTEfö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
sessionrefereras till med schemakvalificeraren, till exempelsession.object_nameellersystem.session.object_name.SQL-konfigurationer (till exempel
ANSI_MODEeller 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 DEFINERbrö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ärdadeCALL. Se Behörig användare och sessionsanvändare för hur den behöriga användaren och sessionsanvändaren skiljer sig åt i enSQL SECURITY DEFINERbrö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_commentmåste varaSTRINGbokstavlig. Standardvärdet ärNULL.STANDARDSORTERING default_collation_name
Gäller för:
Databricks
Databricks Runtime 17.1 och senareAnger standardsortering av proceduren. Standardsortering av proceduren används som standardsortering för procedureparametrar,
DEFAULTuttryck för parametrar,STRINGinskrivna lokala variabler som deklarerats i procedurtexten ochSTRINGliteraler som används i procedurens brödtext.I Databricks Runtime 17.1 till Databricks Runtime 18.2
default_collation_namemåste varaUTF8_BINARY. Den här satsen är obligatorisk om schemat där proceduren skapas har en annan standardsortering änUTF8_BINARY.Gäller för:
Databricks
Databricks Runtime 18 och senaredefault_collation_namekan 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
- 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
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');