Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применяется к:
Databricks SQL
Databricks Runtime 16.3 и более поздним версиям
Реализует блок скрипта SQL, который может содержать последовательность инструкций SQL, инструкций управления потоком, объявлений локальных переменных и обработчиков исключений. При пометке как ATOMIC, блок выполняется как транзакционная единица, в которой либо все операции завершаются успешно, либо все завершаются сбоем.
Заметка
При вызове составной инструкции из записной книжки она должна быть единственной инструкцией в ячейке.
Синтаксис
[ 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 } [, ...] }
До Databricks Runtime 17.2 можно объявить только одну переменную одновременно.
Параметры
-
Необязательный идентификатор используется для квалификации переменных, определенных в составном, и для выхода из него. Оба вхождения меток должны совпадать, а метка
ENDможет быть указана только в том случае, если указанlabel:.Метка не должна быть указана для составной инструкции верхнего уровня или для составной инструкции
ATOMIC. ATOMICПрименяется к:
Databricks SQL
Databricks Runtime 17.0 и вышеЭто важно
Составные инструкции ATOMIC находятся в общедоступной предварительной версии.
Помечает составную инструкцию как блок атомарных транзакций. Все инструкции в блоке выполняются как единая транзакция: либо все инструкции успешно выполняются вместе, либо все изменения откатываются в случае ошибки любой инструкции. Azure Databricks автоматически фиксирует изменения при успешном завершении блока или откатывает все изменения при сбое любой инструкции.
Атомарные блоки обеспечивают ту же изоляцию, видимость, обработку ошибок и ограничение семантики, что и явные интерактивные транзакции. Однако атомарные блоки предлагают более простой синтаксис с автоматическим поведением фиксации и отката.
BEGIN ATOMIC ... ENDВвод блока неявно начинает транзакцию. Успешное завершение неявно фиксирует транзакцию. Ошибки вызывают прерывание транзакции и откат автоматически.Заметка
Для транзакций с несколькими таблицами требуется Databricks Runtime 18.0 и более поздних версий, а также фиксации каталога для всех таблиц. Атомарные транзакции с одной таблицей работают в Databricks Runtime 17.0 и выше без дополнительных требований.
Следующие ограничения применяются к атомарным составным операторам:
-
BEGIN ATOMIC ... ENDблоки можно вызывать в других атомарных блоках. Внутренний блок встраивается во внешнюю транзакцию — все операции выполняются как часть одной более крупной транзакции. Это не вложенная транзакция. Атомарный блок не может содержать не атомарныйBEGIN ... ENDблок. - Атомарные блоки нельзя вложить в не атомарные
BEGIN ... ENDблоки. - Обработчики исключений (
DECLARE ... HANDLER) не допускаются в атомарных блоках. - Атомарные блоки нельзя определить в обработчиках исключений.
- В атомарных блоках разрешены только операции DML (
INSERT,UPDATE,DELETEMERGESELECT, ), операторы переменных, объявления переменных и назначения, операторы потока управления (IF,SIGNALи аналогичные), а также вызовы атомарных хранимых процедур. Операторы DDL и другие операции не поддерживаются. - Настройка локальных или сеансовых переменных не является транзакционной. То есть назначения переменных не подлежат откату при сбое транзакции.
-
NOT ATOMICУказывает, что, если инструкция SQL в составной части завершится ошибкой, предыдущие инструкции SQL не будут откатаны. Это поведение по умолчанию, если
ATOMICоно не указано.declare_variableОбъявление локальной переменной для одной или нескольких переменных
-
Имя переменной. Имя не должно быть квалифицировано, а также должно быть уникальным в составной инструкции.
data_typeЛюбой поддерживаемый тип данных. Если data_type опущен, необходимо указать DEFAULT, а тип является производным от default_expression.
{ DEFAULT | = } default_expressionОпределяет начальное значение переменной после объявления. default_expression должен быть преобразуемым к типу данных. Если значение по умолчанию не задано, переменная инициализирована с значением NULL.
-
Declare_conditionОбъявление локального условия
-
Некавалифицированное имя условия распространяется на составную инструкцию.
sqlstateSTRINGлитерал из 5 буквенно-цифровых символов (без учета регистра), состоящий из A-Z и 0-9. SQLSTATE не должен начинаться с "00", "01" или "XX". Все SQLSTATE, начиная с "02", также будут пойманы предопределенным исключением NOT FOUND. Если значение не указано, значение SQLSTATE равно 45000.
-
-
Область применения:
Databricks Runtime 18.1 и вышеЛокальное объявление курсора для итерации результатов запроса.
Заметка
Для
DECLARE CURSORэтого обнаруживаются и возникают только синтаксические ошибки. Запрос не выполняется, пока курсор не будет открыт с помощью OPEN.-
cursor_name: неквалифицированное имя курсора, уникальное среди курсоров в этой составной инструкции. При ссылке на курсор в OPEN, FETCH или CLOSE можно присвоить имя курсора с помощью метки составной инструкции (например,
label.my_cursorдля диамбигуации в вложенных областях). -
ASENSITIVE|INSENSITIVE: необязательно. После открытия курсора результирующий набор не влияет на изменения DML. Это поведение по умолчанию и поддерживается только в этом случае. - запрос: запрос , определяющий курсор; он выполняется при открытии курсора с помощью OPEN.
-
cursor_name: неквалифицированное имя курсора, уникальное среди курсоров в этой составной инструкции. При ссылке на курсор в OPEN, FETCH или CLOSE можно присвоить имя курсора с помощью метки составной инструкции (например,
declare_handlerОбъявление для обработчика ошибок.
handler_typeEXITКлассифицирует обработчик для выхода из составной инструкции после обработки условия. Все курсоры, открытые в составной инструкции и вложенные составные инструкции, неявно закрыты.
CONTINUEОбласть применения:
Databricks Runtime 18.1 и вышеКлассифицирует обработчик, чтобы продолжить выполнение после завершения обработчика. Выполнение возобновляется с помощью инструкции, следующей за той, которая вызвала условие.
condition_values** Указывает, на какие sqlstates или условия применяется обработчик. Значения условий должны быть уникальными во всех обработчиках в объединённом блоке. Определенные значения условий имеют приоритет над
SQLEXCEPTION.sqlstateSTRINGлитерал из 5 символов'A'-'Z'и'0'-'9'(без учета регистра).-
Условие, определенное в этом составном операторе, внешнем блоке операторов или системном классе ошибок.
SQLEXCEPTIONПрименяется к любому условию ошибки, с которым сталкиваются пользователи.
NOT FOUNDПрименяется к любому условию ошибки с классом SQLSTATE "02", включая условие CURSOR_NO_MORE_ROWS (SQLSTATE
'02000'), возникающее при получении за пределы результирующий набор курсора.handler_actionИнструкция SQL для выполнения при возникновении любого из значений условия. Чтобы добавить несколько операторов, используйте вложенную составную инструкцию.
SQL_statementИнструкция SQL, например DDL, DML, инструкция управления или составная инструкция. Любая инструкция
SELECTилиVALUESсоздает результирующий набор, который может использовать вызывающая сторона.
Примеры
Не атомарный составной оператор с обработчиком исключений
-- 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
Оператор атомарного составного соединения
-- 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;
Атомарная составная инструкция с автоматическим откатом
-- 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
Атомарная составная инструкция с переменными
-- 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;
Связанные статьи
- Программирование на SQL
- Транзакции
- Режимы транзакций
- НАЧАЛО СДЕЛКИ
- COMMIT
- ROLLBACK
- Инструкция CASE
- Оператор IF
- Оператор LOOP
- Инструкция WHILE
- Инструкция REPEAT
- инструкции FOR
- Оператор ITERATE
- Оператор LEAVE
- Утверждение SIGNAl
- Заявление RESIGNAL
- GET Инструкция DIAGNOSTICS
- Инструкция OPEN
- Оператор FETCH
- Оператор CLOSE