Condividi tramite


Istruzione composta `BEGIN` `END`

Si applica a:contrassegnato sì Databricks SQL contrassegnato sì 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

  • etichetta

    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 END può essere specificata solo se viene specificato label:.

    L'etichetta non deve essere specificata per un'istruzione composta di primo livello o per un'istruzione ATOMIC composta.

  • ATOMIC

    Si applica a:spunta su sì Databricks SQL spunta su sì Databricks Runtime 17.0 e versioni successive

    Importante

    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 ... END blocco 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 ... END I 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 atomico BEGIN ... 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), SELECT istruzioni, 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 ATOMIC

    Specifica 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 ATOMIC non viene specificato.

  • declare_variable

    Dichiarazione di variabile locale per una o più variabili

    • variable_name

      Nome della variabile. Il nome non deve includere qualificatore e deve essere univoco all'interno del blocco di istruzioni.

    • data_type

      Qualsiasi tipo di dati supportato. Se data_type viene omesso, è necessario specificare DEFAULT e il tipo è derivato dal default_expression.

    • { DEFAULT | = } default_expression

      Definisce 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_condition

    Dichiarazione di condizione locale

    • nome_condizione

      Il nome non qualificato della condizione è racchiuso all'interno dell'istruzione composta.

    • sqlstate

      Valore letterale STRING di 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'.

  • declare_cursor

    Si applica a:check contrassegnato come sì Databricks Runtime 18.1 e versioni successive

    Dichiarazione 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.
  • declare_handler

    Dichiarazione per un gestore di errori.

    • handler_type

      • EXIT

        Classifica 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.

      • CONTINUE

        Si applica a:check contrassegnato come sì Databricks Runtime 18.1 e versioni successive

        Classifica 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_values

      Specifica 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.

    • sqlstate

      Valore letterale STRING di 5 caratteri 'A'-'Z' e '0'-'9' (senza distinzione di maiuscole e minuscole).

    • nome_condizione

      Condizione definita all'interno di questo composto, un'istruzione composta esterna o una classe di errore definita dal sistema.

    • SQLEXCEPTION

      Si applica a qualsiasi condizione di errore rivolta all'utente.

    • NOT FOUND

      Si 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_action

      Istruzione SQL da eseguire quando si verifica uno dei valori della condizione. Per aggiungere più istruzioni, usare un'istruzione composta annidata.

  • SQL_statement

    Istruzione SQL, ad esempio un'istruzione DDL, DML, un'istruzione control o un'istruzione composta. Qualsiasi istruzione SELECT o VALUES produce 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;