Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:
Databricks SQL
Databricks Runtime 16.3 e versioni successive
Implementa un blocco di script SQL che può contenere una sequenza di istruzioni SQL, istruzioni control-of-flow, dichiarazioni di variabili locali e gestori di eccezioni. Se contrassegnato come ATOMIC, il blocco viene eseguito come unità transazionale in cui tutte le istruzioni riescono o falliscono insieme.
Nota
Quando si richiama un'istruzione composta da un notebook, questa deve essere l'unica istruzione nella cella.
Sintassi
[ 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 } [, ...] }
Prima di Databricks Runtime 17.2 è possibile dichiarare una sola variabile alla volta.
Parametri
-
Un identificatore facoltativo viene usato per qualificare le variabili definite all'interno del composto e per lasciare il composto. Entrambe le occorrenze dell'etichetta devono corrispondere e l'etichetta
ENDpuò essere specificata solo se viene specificatolabel:.L'etichetta non deve essere specificata per un'istruzione composta di primo livello o per un'istruzione
ATOMICcomposta. ATOMICSi applica a:
Databricks SQL
Databricks Runtime 17.0 e versioni successiveImportante
Le istruzioni composte ATOMIC sono disponibili in anteprima pubblica.
Contrassegna l'istruzione composta come blocco di transazioni atomiche. Tutte le istruzioni all'interno del blocco vengono eseguite come un'unica unità transazionale: o tutte le istruzioni vanno a buon fine insieme, oppure vengono annullate tutte le modifiche se una qualsiasi istruzione fallisce. Azure Databricks esegue automaticamente il commit delle modifiche quando il blocco viene completato correttamente o annulla tutte le modifiche se una dichiarazione fallisce.
I blocchi atomici forniscono la stessa semantica di isolamento, visibilità, gestione degli errori e limite delle transazioni interattive esplicite. Tuttavia, i blocchi atomici offrono una sintassi più semplice con il comportamento automatico di commit e rollback.
L'immissione di un
BEGIN ATOMIC ... ENDblocco inizia in modo implicito una transazione. Il completamento con esito positivo esegue in modo implicito il commit della transazione. Gli errori causano l'interruzione e il rollback automatico della transazione.Nota
Le transazioni con più tabelle richiedono Databricks Runtime 18.0 e versioni successive e commit gestiti dal catalogo abilitati in tutte le tabelle. Le transazioni atomiche a tabella singola funzionano in Databricks Runtime 17.0 e versioni successive senza requisiti aggiuntivi.
Le restrizioni seguenti si applicano alle istruzioni composte atomiche:
-
BEGIN ATOMIC ... ENDI blocchi possono essere chiamati all'interno di altri blocchi atomici. Il blocco interno viene integrato nella transazione esterna. Tutte le istruzioni vengono eseguite come parte di una transazione unica e più grande. Non si tratta di una transazione nidificata. Un blocco atomico non può contenere un blocco non atomicoBEGIN ... END. - I blocchi atomici non possono essere annidati all'interno di blocchi non atomici
BEGIN ... END. - I gestori di eccezioni (
DECLARE ... HANDLER) non sono consentiti all'interno di blocchi atomici. - I blocchi atomici non possono essere definiti all'interno di gestori di eccezioni.
- Solo le operazioni DML (
INSERT,UPDATE,DELETE,MERGE),SELECTistruzioni, dichiarazioni di variabili e assegnazioni, istruzioni del flusso di controllo (IF,SIGNALe simili) e chiamate a stored procedure atomiche sono consentite all'interno di blocchi atomici. Le istruzioni DDL e altre operazioni non sono supportate. - L'impostazione delle variabili locali o di sessione non è transazionale. Ovvero, le assegnazioni di variabili non sono soggette al rollback in caso di errore della transazione.
Vedere Transazioni non interattive.
-
NOT ATOMICSpecifica che, se un'istruzione SQL all'interno del composto ha esito negativo, non verrà eseguito il rollback delle istruzioni SQL precedenti. Questo è il comportamento predefinito quando
ATOMICnon viene specificato.declare_variableDichiarazione di variabile locale per una o più variabili
-
Nome della variabile. Il nome non deve includere qualificatore e deve essere univoco all'interno del blocco di istruzioni.
data_typeQualsiasi tipo di dati supportato. Se data_type viene omesso, è necessario specificare DEFAULT e il tipo è derivato dal default_expression.
{ DEFAULT | = } default_expressionDefinisce il valore iniziale della variabile dopo la dichiarazione. default_expression deve poter essere convertito in data_type. Se non viene specificato alcun valore predefinito, la variabile viene inizializzata con NULL.
-
Declare_conditionDichiarazione di condizione locale
-
Il nome non qualificato della condizione è racchiuso all'interno dell'istruzione composta.
sqlstateValore letterale
STRINGdi 5 caratteri alfanumerici (senza distinzione tra maiuscole e minuscole) costituito da A-Z e 0..9. SQLSTATE non deve iniziare con '00', '01' o 'XX'. Qualsiasi SQLSTATE a partire da '02' verrà intercettato anche dall'eccezione PREDEFINITa NOT FOUND. Se non specificato, SQLSTATE è '45000'.
-
-
Si applica a:
Databricks Runtime 18.1 e versioni successiveDichiarazione di cursore locale per l'iterazione dei risultati della query.
Nota
Per
DECLARE CURSOR, vengono rilevati e generati solo errori di sintassi. La query non viene eseguita finché il cursore non viene aperto con OPEN.-
cursor_name: nome non qualificato per il cursore, univoco tra i cursori in questa istruzione composta. Quando si fa riferimento al cursore in OPEN, FETCH o CLOSE, è possibile qualificare il nome del cursore con l'etichetta di istruzione composta ( ad esempio
label.my_cursor) per disambiguare negli ambiti annidati. -
ASENSITIVE|INSENSITIVE: facoltativo. Una volta aperto il cursore, il set di risultati non è interessato dalle modifiche DML. Si tratta del comportamento predefinito e supportato solo. - query: query che definisce il cursore; viene eseguito quando il cursore viene aperto con OPEN.
-
cursor_name: nome non qualificato per il cursore, univoco tra i cursori in questa istruzione composta. Quando si fa riferimento al cursore in OPEN, FETCH o CLOSE, è possibile qualificare il nome del cursore con l'etichetta di istruzione composta ( ad esempio
declare_handlerDichiarazione per un gestore di errori.
handler_typeEXITClassifica il tipo di gestore per uscire dall'istruzione composta dopo che la condizione è stata gestita. Tutti i cursori aperti all'interno dell'istruzione composta e le istruzioni composte annidate vengono chiusi in modo implicito.
CONTINUESi applica a:
Databricks Runtime 18.1 e versioni successiveClassifica il gestore per continuare l'esecuzione al termine del gestore. L'esecuzione riprende con l'istruzione che segue quella che ha generato la condizione.
condition_valuesSpecifica a quali sqlstate o condizioni si applica il gestore. I valori delle condizioni devono essere univoci tra tutti i gestori dell'istruzione composta. I valori di condizione specifici hanno la precedenza su
SQLEXCEPTION.sqlstateValore letterale
STRINGdi 5 caratteri'A'-'Z'e'0'-'9'(senza distinzione di maiuscole e minuscole).-
Condizione definita all'interno di questo composto, un'istruzione composta esterna o una classe di errore definita dal sistema.
SQLEXCEPTIONSi applica a qualsiasi condizione di errore rivolta all'utente.
NOT FOUNDSi applica a qualsiasi condizione di errore con una classe SQLSTATE '02', inclusa la condizione di CURSOR_NO_MORE_ROWS (SQLSTATE
'02000') generata durante il recupero oltre la fine di un set di risultati del cursore.handler_actionIstruzione SQL da eseguire quando si verifica uno dei valori della condizione. Per aggiungere più istruzioni, usare un'istruzione composta annidata.
SQL_statementIstruzione SQL, ad esempio un'istruzione DDL, DML, un'istruzione control o un'istruzione composta. Qualsiasi istruzione
SELECToVALUESproduce un set di risultati che il invoker può utilizzare.
Esempi
Istruzione composta non atomica con gestore eccezioni
-- 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
Istruzione composta atomica
-- 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;
Istruzione composta atomica con rollback automatico
-- 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
Istruzione composta atomica con variabili
-- 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;
Articoli correlati
- sql scripting
- Transazioni
- Modalità di transazione
- INIZIO TRANSAZIONE
- COMMIT
- ROLLBACK
- 'istruzione CASE
- 'istruzione IF
- istruzione LOOP
- 'istruzione WHILE
- istruzione REPEAT
- Istruzione FOR
- Istruzione ITERATE
- ISTRUZIONE LEAVE
- Dichiarazione SIGNAL
- 'istruzione RESIGNAL
- GET Diagnostica
- Istruzione OPEN
- Istruzione FETCH
- Istruzione CLOSE