Složený příkaz BEGIN END

Platí pro:zaškrtnuto jako ano Databricks SQL zaškrtnuto jako ano Databricks Runtime 16.3 a vyšší

Implementuje blok skriptu SQL, který může obsahovat posloupnost příkazů SQL, příkazy control-of-flow, místní deklarace proměnných a obslužné rutiny výjimek. Pokud je blok označený jako ATOMIC, spustí se jako transakční jednotka, kde všechny příkazy uspějí společně nebo selžou dohromady.

Poznámka

Při vyvolání složeného příkazu z poznámkového bloku musí být jediným příkazem v buňce.

Syntaxe

[ 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 } [, ...] }

Před modulem Databricks Runtime 17.2 můžete deklarovat pouze jednu proměnnou najednou.

Parametry

  • štítek

    Volitelný identifikátor se používá ke kvalifikaci proměnných definovaných v rámci složky a k opuštění složky. Oba výskyty popisků se musí shodovat a popisek END lze zadat pouze v případě, že je zadán label:.

    popisek nesmí být určen pro složený příkaz nejvyšší úrovně ani pro složený ATOMIC příkaz.

  • ATOMIC

    Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime 17.0 a výše

    Důležité

    Složené příkazy ATOMIC jsou ve verzi Public Preview.

    Označí složený příkaz jako atomický blok transakce. Všechny příkazy v rámci bloku se spouští jako jedna transakční jednotka: buď všechny příkazy uspět společně, nebo všechny změny se vrátí zpět, pokud některý příkaz selže. Azure Databricks automaticky potvrdí změny, jakmile se blok úspěšně dokončí, nebo vrátí zpět všechny změny, pokud některý příkaz selže.

    Atomové bloky poskytují stejnou izolaci, viditelnost, zpracování chyb a omezení sémantiky jako explicitní interaktivní transakce. Atomové bloky ale nabízejí jednodušší syntaxi s automatickým chováním potvrzení a vrácení zpět.

    Vstup do BEGIN ATOMIC ... END bloku implicitně zahájí transakci. Úspěšné dokončení implicitně potvrdí transakci. Chyby způsobují přerušení transakce a vrácení zpět automaticky.

    Poznámka

    Transakce s více tabulkami vyžadují databricks Runtime 18.0 a vyšší a potvrzení katalogu povolená pro všechny tabulky. Atomické transakce s jednou tabulkou fungují v Databricks Runtime 17.0 a vyšší bez dalších požadavků.

    Následující omezení platí pro atomické složené příkazy:

    • BEGIN ATOMIC ... END bloky lze volat v jiných atomických blocích. Vnitřní blok je zploštěný do vnější transakce. Všechny příkazy běží jako součást jedné větší transakce. Nejedná se o vnořenou transakci. Atomický blok nemůže obsahovat ne atomický BEGIN ... END blok.
    • Atomové bloky nelze vnořit do ne atomických BEGIN ... END bloků.
    • Obslužné rutiny výjimek (DECLARE ... HANDLER) nejsou povoleny v atomických blocích.
    • Atomické bloky nelze definovat v rámci obslužných rutin výjimek.
    • V atomických blocích jsou povoleny pouze operace DML (INSERT, UPDATE, , DELETEMERGE), SELECT příkazy, deklarace proměnných a přiřazení, příkazy toku řízení (IF, SIGNALa podobné) a volání atomických uložených procedur. Příkazy DDL a další operace se nepodporují.
    • Nastavení místních proměnných nebo proměnných relace není transakční. To znamená, že přiřazení proměnných nejsou předmětem vrácení zpět při selhání transakce.

    Viz Neinteraktivní transakce.

  • NOT ATOMIC

    Určuje, že pokud příkaz SQL v rámci složené složky selže, předchozí příkazy SQL nebudou vráceny zpět. Toto je výchozí chování, pokud ATOMIC není zadáno.

  • declare_variable

    Deklarace místní proměnné pro jednu nebo více proměnných

    • variable_name

      Název proměnné. Název nesmí být kvalifikovaný a musí být jedinečný v rámci složeného příkazu.

    • data_type

      Libovolný podporovaný datový typ. Pokud data_type vynecháte, je nutné zadat výchozí hodnotu a typ je odvozen z default_expression.

    • { DEFAULT | = } default_expression

      Definuje počáteční hodnotu proměnné po deklaraci. default_expression musí být přetypovatelný na data_type. Pokud není zadána žádná výchozí hodnota, proměnná se inicializuje s hodnotou NULL.

  • Declare_condition

    Deklarace místní podmínky

    • název_podmínky

      Nekvalifikovaný název podmínky je omezen na složený příkaz.

    • sqlstate

      STRING literál s 5 alfanumerickými znaky (nerozlišující malá a velká písmena) sestávající z A-Z a 0,.9. SQLSTATE nesmí začínat na 00, 01 nebo XX. Jakýkoli kód SQLSTATE, který začíná s '02', bude také zachycen předdefinovanou výjimkou NOT FOUND. Pokud není zadaný, je SQLSTATE 45000.

  • declare_cursor

    Platí pro:check označený ano Databricks Runtime 18.1 a novější

    Deklarace místního kurzoru pro iteraci prostřednictvím výsledků dotazu.

    Poznámka

    V případě DECLARE CURSOR, jsou zjištěny a vyvolány pouze chyby syntaxe. Dotaz se nespustí, dokud se kurzor neotevře pomocí příkazu OPEN.

    • cursor_name: Nekvalifikovaný název kurzoru, jedinečný mezi kurzory v tomto složeném příkazu. Při odkazování na kurzor v příkazu OPEN, FETCH nebo CLOSE můžete kvalifikovat název kurzoru pomocí popisku složeného příkazu (např. label.my_cursor) pro nejednoznačnost v vnořených oborech.
    • ASENSITIVE | INSENSITIVE: Volitelné. Po otevření kurzoru není sada výsledků změnami DML ovlivněna. Toto je výchozí a pouze podporované chování.
    • dotaz: Dotaz , který definuje kurzor; spustí se při otevření kurzoru pomocí příkazu OPEN.
  • declare_handler

    Deklarace obslužné rutiny chyby.

    • handler_type

      • EXIT

        Klasifikuje obslužnou rutinu tak, aby po zpracování podmínky ukončila složený příkaz. Všechny kurzory otevřené v rámci složeného příkazu a vnořené složené příkazy jsou implicitně uzavřeny.

      • CONTINUE

        Platí pro:check označený ano Databricks Runtime 18.1 a novější

        Klasifikuje obslužnou rutinu tak, aby pokračovala v provádění po dokončení obslužné rutiny. Provádění se obnoví příkazem, který následuje za podmínkou.

    • condition_values

      Určuje, na které SQL stavy nebo podmínky se obslužná rutina vztahuje. Podmínkové hodnoty musí být jedinečné ve všech obslužných rutinách v rámci složeného příkazu. Konkrétní hodnoty podmínky mají přednost před SQLEXCEPTION.

    • sqlstate

      Literál STRING o délce 5 znaků 'A'-'Z' a '0'-'9' (bez rozlišení velkých a malých písmen).

    • název_podmínky

      Podmínka definovaná v rámci této sloučeniny, vnější složený příkaz nebo systémově definovaná třída chyb.

    • SQLEXCEPTION

      Platí pro všechny uživatelské chybové podmínky.

    • NOT FOUND

      Platí pro všechny chybové stavy s třídou SQLSTATE 02, včetně podmínky CURSOR_NO_MORE_ROWS (SQLSTATE '02000') vyvolané při načítání za koncem sady výsledků kurzoru.

    • handler_action

      Příkaz SQL, který se má provést, když dojde k některé z hodnot podmínky. Pokud chcete přidat více příkazů, použijte vnořený složený příkaz.

  • SQL_statement

    Příkaz SQL, jako je DDL, DML, řídicí příkaz nebo složený příkaz. Jakýkoli příkaz SELECT nebo VALUES vytvoří sadu výsledků, kterou může invoker využívat.

Příklady

Ne atomický složený příkaz s obslužnou rutinou výjimky

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

Atomický složený příkaz

-- 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;

Atomický složený příkaz s automatickým vrácením zpět

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

Atomický složený příkaz s proměnnými

-- 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;