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 16.3 e superior
Implementa um bloco de Script SQL que pode conter uma sequência de instruções SQL, instruções de controle de fluxo, declarações de variáveis locais e manipuladores de exceções. Quando marcado como ATOMIC, o bloco executa-se como uma unidade transacional onde todas as instruções têm sucesso em conjunto ou falham em conjunto.
Observação
Ao invocar uma instrução composta de um bloco de anotações, ela deve ser a única instrução na célula.
Sintaxe
[ label : ]
BEGIN [ ATOMIC ]
[ { declare_variable | declare_condition } ; [...] ]
[ declare_cursor ; [...] ]
[ declare_handler ; [...] ]
[ SQL_statement ; [...] ]
END [ label ]
declare_variable
DECLARE variable_name [, ...] datatype [ DEFAULT default_expr ]
declare_condition
DECLARE condition_name CONDITION [ FOR SQLSTATE [ VALUE ] sqlstate ]
declare_cursor
DECLARE cursor_name [ ASENSITIVE | INSENSITIVE ] CURSOR FOR query [ FOR READ ONLY ]
declare_handler
DECLARE handler_type HANDLER FOR condition_values handler_action
handler_type
EXIT | CONTINUE
condition_values
{ { SQLSTATE [ VALUE ] sqlstate | condition_name } [, ...] |
{ SQLEXCEPTION | NOT FOUND } [, ...] }
Antes do Databricks Runtime 17.2, você só podia declarar uma variável de cada vez.
Parâmetros
-
Um identificador opcional é usado para qualificar variáveis definidas dentro do composto e para sair do composto. Ambas as ocorrências de rótulo devem corresponder, e o rótulo
ENDsó pode ser especificado selabel:for também especificado.O rótulo não deve ser especificado para uma declaração composta de nível superior nem para uma
ATOMICdeclaração composta. ATOMICAplica-se a:
Databricks SQL
Databricks Runtime 17.0 e superioresImportante
As declarações do composto ATOMIC encontram-se em Pré-visualização Pública.
Marca a declaração composta como um bloco transacional atómico. Todas as instruções dentro do bloco executam-se como uma única unidade transacional — ou todas as instruções têm sucesso em conjunto, ou todas as alterações são revertidas se alguma instrução falhar. O Azure Databricks confirma automaticamente as alterações quando o bloco é concluído com sucesso, ou reverte todas as alterações se alguma instrução falhar.
Os blocos atómicos proporcionam o mesmo isolamento, visibilidade, gestão de erros e semântica de limites que as transações interativas explícitas. No entanto, os blocos atómicos oferecem uma sintaxe mais simples com comportamento automático de commit e rollback.
Introduzir um
BEGIN ATOMIC ... ENDbloco inicia implicitamente uma transação. A conclusão bem-sucedida compromete implicitamente a transação. Erros fazem com que a transação aborte e reverta automaticamente.Observação
As transações multi-tabela requerem Databricks Runtime 18.0 e superiores e comits geridos por catálogo ativados em todas as tabelas. Transações atómicas de tabela única funcionam no Databricks Runtime 17.0 e superiores sem requisitos adicionais.
As seguintes restrições aplicam-se às declarações de compostos atómicos:
-
BEGIN ATOMIC ... ENDOs blocos podem ser chamados dentro de outros blocos atómicos. O bloco interior é incorporado na transação exterior — todas as instruções são executadas como parte de uma única transação maior. Isto não é uma transação aninhada. Um bloco atómico não pode conter um bloco não atómicoBEGIN ... END. - Blocos atómicos não podem ser aninhados dentro de blocos não atómicos
BEGIN ... END. - Manipuladores de exceções (
DECLARE ... HANDLER) não são permitidos dentro de blocos atómicos. - Blocos atómicos não podem ser definidos dentro dos tratadores de exceções.
- Apenas operações DML (, , , ), instruções
SELECT, declarações e atribuições de variáveis, instruções de controlo-fluxo (IF,SIGNAL, e similares) e chamadas a procedimentos armazenados atómicos são permitidas dentro dos blocos atómicos.MERGEDELETEUPDATEINSERTInstruções DDL e outras operações não são suportadas. - A definição de variáveis locais ou de sessão não é transacional. Ou seja, as atribuições de variáveis não estão sujeitas a ser revertidas em caso de falha na transação.
-
NOT ATOMICEspecifica que, se uma instrução SQL dentro do composto falhar, as instruções SQL anteriores não serão revertidas. Este é o comportamento padrão quando
ATOMICnão está especificado.declare_variableUma declaração de variável local para uma ou mais variáveis
-
Um nome para a variável. O nome não deve ser qualificado e deve ser exclusivo dentro da declaração composta.
data_typeQualquer tipo de dados suportado. Se o data_type for omitido, deverá especificar DEFAULT, e o tipo será derivado da expressão padrão.
{ DEFAULT | = } default_expressionDefine o valor inicial da variável após a declaração. default_expression deve ser convertível para data_type. Se nenhum padrão for especificado, a variável será inicializada com NULL.
-
Declare_conditionUma declaração de condição local
-
O nome não qualificado da condição está delimitado pela instrução composta.
sqlstateUm literal
STRINGde 5 caracteres alfanuméricos (sem distinção entre maiúsculas e minúsculas) que consiste em A-Z e 0..9. O SQLSTATE não deve começar com '00', '01' ou 'XX'. Qualquer SQLSTATE começando com '02' será capturado também pela exceção predefinida NOT FOUND. Se não for especificado, o SQLSTATE será '45000'.
-
-
Aplica-se a:
Runtime 18.1 e superioresUma declaração local do cursor para iterar através dos resultados da consulta.
Observação
Para
DECLARE CURSOR, apenas erros de sintaxe são detetados e aumentados. A consulta só é executada quando o cursor é aberto com OPEN.-
cursor_name: Um nome não qualificado para o cursor, único entre os cursores nesta instrução composta. Ao referenciar o cursor em OPEN, FETCH ou CLOSE, pode qualificar o nome do cursor com a etiqueta da instrução composta (por exemplo,
label.my_cursor) para desambiguar em escopos aninhados. -
ASENSITIVE|INSENSITIVE: Opcional. Uma vez aberto o cursor, o conjunto de resultados não é afetado pelas alterações do DML. Este é o comportamento padrão e o único suportado. - consulta: A consulta que define o cursor; é executado quando o cursor é aberto com OPEN.
-
cursor_name: Um nome não qualificado para o cursor, único entre os cursores nesta instrução composta. Ao referenciar o cursor em OPEN, FETCH ou CLOSE, pode qualificar o nome do cursor com a etiqueta da instrução composta (por exemplo,
declare_handlerUma declaração para um manipulador de erros.
handler_typeEXITDesigna o manipulador para sair da instrução composta depois que a condição é tratada. Todos os cursores abertos dentro da instrução composta e as instruções compostas aninhadas estão implicitamente fechadas.
CONTINUEAplica-se a:
Runtime 18.1 e superioresClassifica o handler para continuar a execução após a conclusão do handler. A execução recomeça com a instrução seguinte àquela que levantou a condição.
condition_valuesEspecifica a quais sqlstates ou condições o manipulador se aplica. Os valores de condição devem ser exclusivos em todos os manipuladores dentro da instrução composta. Os valores de condição específica têm precedência sobre
SQLEXCEPTION.sqlstateUm literal de 5 caracteres
STRING,'A'-'Z'e'0'-'9'(sem distinção de maiúsculas e minúsculas).-
Uma condição definida dentro desse composto, uma instrução composta externa ou uma classe de erro definida pelo sistema.
SQLEXCEPTIONAplica-se a qualquer condição de erro voltada para o usuário.
NOT FOUNDAplica-se a qualquer condição de erro com uma classe SQLSTATE '02', incluindo a condição de CURSOR_NO_MORE_ROWS (SQLSTATE
'02000') levantada ao buscar para além do final de um conjunto de resultados de cursor.handler_actionUma instrução SQL para executar quando qualquer um dos valores de condição ocorrer. Para adicionar várias instruções, use uma instrução composta aninhada.
SQL_statementUma instrução SQL, como DDL, DML, instrução de controle ou instrução composta. Qualquer instrução
SELECTouVALUESproduz um conjunto de resultados que o invocador pode consumir.
Exemplos
Enunciado composto não-atómico com tratador de exceções
-- A compound statement with local variables, exit handler, and nested compound
> BEGIN
DECLARE a INT DEFAULT 1;
DECLARE b INT DEFAULT 5;
DECLARE EXIT HANDLER FOR DIVIDE_BY_ZERO
div0: BEGIN
VALUES (15);
END div0;
SET a = 10;
SET a = b / 0;
VALUES (a);
END;
15
Enunciado do composto atómico
-- An atomic compound statement that ensures all changes commit together
> BEGIN ATOMIC
INSERT INTO accounts VALUES (1, 'Alice', 1000);
INSERT INTO accounts VALUES (2, 'Bob', 2000);
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
END;
Instrução composta atómica com retrocesso automático
-- If any statement fails, all changes are rolled back automatically
> BEGIN ATOMIC
INSERT INTO orders VALUES (101, 'Product A', 50.00);
UPDATE inventory SET quantity = quantity - 1 WHERE product = 'Product A';
-- If this statement fails, both the INSERT and UPDATE are rolled back
INSERT INTO audit_log VALUES (101, current_timestamp(), 1/0);
END;
-- Error: Division by zero
-- All changes rolled back automatically
Enunciado do composto atómico com variáveis
-- Variables can be used within atomic blocks
> BEGIN ATOMIC
DECLARE total_amount DECIMAL(10, 2);
INSERT INTO sales VALUES (301, 150.00, current_date());
SET total_amount = (SELECT SUM(amount) FROM sales WHERE sale_date = current_date());
UPDATE daily_summary SET total = total_amount WHERE summary_date = current_date();
END;
Artigos relacionados
- de scripts SQL
- Transações
- Modos de transação
- INICIAR TRANSAÇÃO
- COMMITAR
- ROLLBACK
- Declaração CASE
- Declaração IF
- Declaração LOOP
- Declaração ENQUANTO
- Declaração REPETIR
- FOR Declaração
- Declaração ITERATE
- Declaração de Saída
- Declaração SIGNAl
- Declaração RESIGNAL
- Declaração GET DIAGNOSTICS
- Declaração ABERTA
- Instrução FETCH
- Declaração FINAL