Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:
Databricks SQL Databricks Runtime 17.0 e acima
Unity Catalog somente
Cria um procedimento no Unity Catalog que usa ou modifica argumentos, executa um conjunto de instruções SQL e, opcionalmente, retorna um conjunto de resultados.
Sintaxe
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 }
Parâmetros
OU SUBSTITUIR
Se especificado, um procedimento com o mesmo nome é substituído. Não pode especificar este parâmetro com
IF NOT EXISTS; especificando ambas as elevações INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.SE NÃO EXISTIR
Se especificado, cria o procedimento apenas quando um procedimento com esse nome ainda não existe. Se existir um procedimento com o mesmo nome, a instrução será ignorada. Não pode especificar este parâmetro com
OR REPLACE; especificando ambas as elevações INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.-
Um nome para o procedimento. Opcionalmente, você pode qualificar o nome do procedimento com um nome de esquema. Se o nome não for qualificado, o procedimento permanente será criado no esquema atual.
O nome do procedimento deve ser único para todas as rotinas (procedimentos e funções) no esquema. Se existir uma rotina com o mesmo nome e nem
OR REPLACEIF NOT EXISTSfor especificada, Azure Databricks levanta ROUTINE_ALREADY_EXISTS. procedure_parameter
Especifica um parâmetro do procedimento.
-
O nome do parâmetro deve ser único dentro do procedimento; caso contrário, Azure Databricks aumenta DUPLICATE_ROUTINE_PARAMETER_NAMES.
IN,INOUT ouOUT
Opcionalmente, descreve o modo do parâmetro.
EM
Define um parâmetro somente de entrada. Este é o padrão.
INOUT
Define um parâmetro que aceita um argumento input-output. Se o procedimento for concluído sem um erro não tratado, ele retornará o valor do parâmetro final como uma saída.
FORA
Define um parâmetro de saída. O parâmetro é inicializado para
NULLe, se o procedimento for concluído sem um erro não tratado, ele retornará o valor final do parâmetro como uma saída.
-
Qualquer tipo de dados suportado.
PADRÃO default_expression
Um padrão opcional a ser usado quando uma invocação de função não atribui um argumento ao parâmetro.
default_expressiondeve poder ser convertível paradata_type. A expressão não deve fazer referência a outro parâmetro ou conter uma subconsulta.Quando você especifica um padrão para um parâmetro, todos os parâmetros a seguir também devem ter um padrão.
DEFAULTnão é suportado paraOUTparâmetros;INOUTespecificar um levanta PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.COMENTÁRIO comentário
Uma descrição opcional do parâmetro.
commenttem de ser umSTRINGliteral.
-
-
Uma instrução composta SQL (
BEGIN ... END) com a definição do procedimento SQL.Quando o procedimento é criado, a correção sintática é validada. O corpo do procedimento não é validado quanto à correção semântica até que o procedimento seja invocado.
característica
Um de
SQL SECURITY INVOKERouSQL SECURITY DEFINER, eLANGUAGE SQLsão obrigatórios. Todos os outros são opcionais. Você pode especificar qualquer número de características em qualquer ordem, mas pode especificar cada cláusula apenas uma vez.LINGUAGEM SQL
A linguagem da implementação da função.
INVOCADOR DE SEGURANÇA SQL
Especifica que quaisquer instruções SQL no corpo do procedimento são executadas sob a autoridade do utilizador que invoca o procedimento.
Ao resolver relações e rotinas dentro do corpo do procedimento, o Azure Databricks utiliza o catálogo atual, o esquema atual e o PATH da sessão no momento da invocação.
Consulte Utilizador autorizado e utilizador de sessão para saber como o utilizador autorizado e o utilizador de sessão se comportam dentro dos corpos de procedimentos e entre chamadas aninhadas.
DEFINIDOR DE SEGURANÇA SQL
Aplica-se a:
Databricks SQLEspecifica que quaisquer instruções SQL no corpo do procedimento são sempre executadas sob a autoridade do proprietário (definidor) do procedimento, independentemente do utilizador que o invoque. Ou seja, o proprietário é o utilizador autorizado do corpo. O invocador requer apenas o
EXECUTEprivilégio sobre o procedimento; todas as verificações de acesso em relações, rotinas e outros objetos referenciados do corpo são avaliadas em relação ao utilizador autorizado.Ao resolver relações e rotinas dentro do corpo do procedimento, o Azure Databricks utiliza o catálogo, o esquema e o PATH que estavam atualizados na altura em que o procedimento foi criado. O caminho capturado omite
system.session, pelo que as vistas temporárias, tabelas temporárias, variáveis de sessão e funções temporárias do invocador são encontradas apenas por nomes qualificados, por exemplosession.object_nameousystem.session.object_name. Ver Caminho capturado.Configurações SQL (por exemplo,
ANSI_MODEou o fuso horário padrão) que afetam a semântica das instruções no corpo também são capturadas na altura da criação e usadas em cada invocação do procedimento, independentemente das definições de sessão do invocador.Dentro de um
SQL SECURITY DEFINERcorpo, current_catalog e current_schema devolvem o catálogo e o esquema que estavam atualizados quando o procedimento foi criado. current_path devolve esse caminho capturado, semsystem.session. Não devolve o caminho da sessão do invocador.Um procedimento aninhado
SQL SECURITY INVOKERchamado de umSQL SECURITY DEFINERcorpo utiliza o caminho congelado do procedimento externo, não o caminho de sessão do invocador original.SQL SECURITY DEFINERnão altera o valor de session_user: continua a devolver o utilizador que emitiu oCALL. Consulte Utilizador autorizado e utilizador de sessão para saber como o utilizador autorizado e o utilizador de sessão diferem dentro de umSQL SECURITY DEFINERcorpo.NÃO DETERMINÍSTICO
Um procedimento é assumido como não determinístico, o que significa que pode retornar resultados diferentes em cada invocação, mesmo quando é chamado com os mesmos argumentos.
COMENTÁRIO procedure_comment
Um comentário para o procedimento.
procedure_commentdeve serSTRINGliteral. A predefinição éNULL.COTEJAMENTO PADRÃO default_collation_name
Aplica-se a:
Databricks SQL
Databricks Runtime 17.1 e superiorDefine a classificação padrão do procedimento. A colação padrão do procedimento é usada como a colação padrão para parâmetros do procedimento,
DEFAULTexpressões para parâmetros,STRINGvariáveis locais tipadas declaradas no corpo do procedimento eSTRINGliterais usados no corpo do procedimento.No Databricks Runtime 17.1 até Databricks Runtime 18.2,
default_collation_namedeve serUTF8_BINARY. Esta cláusula é obrigatória se o esquema no qual o procedimento é criado tiver um agrupamento padrão diferente deUTF8_BINARY.Aplica-se a:
Databricks SQL
sim Databricks Runtime 18 LTS e superioresNote
O Databricks Runtime 18 é mais recente do que o Databricks Runtime 18.0, 18.1 e 18.2. Funcionalidades que anteriormente seriam enviadas como versões numeradas posteriores agora são enviadas como atualizações datadas do Databricks Runtime 18. Para mais detalhes, consulte Sobre as notas de lançamento unificadas.
default_collation_namepode ser qualquer nome de colação suportado.Se não especificado, a colação padrão é derivada do esquema em que o procedimento é criado.
MODIFICA DADOS SQL
Presume-se que um procedimento modifique dados SQL.
Condições de erro comuns
- 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
Exemplos
-- 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');