Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:
Databricks SQL
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
-
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
ENDlze zadat pouze v případě, že je zadánlabel:.popisek nesmí být určen pro složený příkaz nejvyšší úrovně ani pro složený
ATOMICpříkaz. ATOMICPlatí pro:
Databricks SQL
Databricks Runtime 17.0 a výšeDů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 ... ENDbloku 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 ... ENDbloky 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 ... ENDblok. - Atomové bloky nelze vnořit do ne atomických
BEGIN ... ENDbloků. - 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),SELECTpří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.
-
NOT ATOMICUrč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
ATOMICnení zadáno.declare_variableDeklarace místní proměnné pro jednu nebo více proměnných
-
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_typeLibovolný podporovaný datový typ. Pokud data_type vynecháte, je nutné zadat výchozí hodnotu a typ je odvozen z default_expression.
{ DEFAULT | = } default_expressionDefinuje 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_conditionDeklarace místní podmínky
-
Nekvalifikovaný název podmínky je omezen na složený příkaz.
sqlstateSTRINGliterá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.
-
-
Platí pro:
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.
-
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ř.
declare_handlerDeklarace obslužné rutiny chyby.
handler_typeEXITKlasifikuje 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.
CONTINUEPlatí pro:
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_valuesUrč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.sqlstateLiterál
STRINGo délce 5 znaků'A'-'Z'a'0'-'9'(bez rozlišení velkých a malých písmen).-
Podmínka definovaná v rámci této sloučeniny, vnější složený příkaz nebo systémově definovaná třída chyb.
SQLEXCEPTIONPlatí pro všechny uživatelské chybové podmínky.
NOT FOUNDPlatí 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_actionPří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_statementPříkaz SQL, jako je DDL, DML, řídicí příkaz nebo složený příkaz. Jakýkoli příkaz
SELECTneboVALUESvytvoří 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;