Конструкция BEGIN END составного оператора

Применяется к:отмечено да 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

    Объявление локальной переменной для одной или нескольких переменных

    • variable_name

      Имя переменной. Имя не должно быть квалифицировано, а также должно быть уникальным в составной инструкции.

    • data_type

      Любой поддерживаемый тип данных. Если data_type опущен, необходимо указать DEFAULT, а тип является производным от default_expression.

    • { DEFAULT | = } default_expression

      Определяет начальное значение переменной после объявления. default_expression должен быть преобразуемым к типу данных. Если значение по умолчанию не задано, переменная инициализирована с значением NULL.

  • Declare_condition

    Объявление локального условия

    • condition_name

      Некавалифицированное имя условия распространяется на составную инструкцию.

    • sqlstate

      STRING литерал из 5 буквенно-цифровых символов (без учета регистра), состоящий из A-Z и 0-9. SQLSTATE не должен начинаться с "00", "01" или "XX". Все SQLSTATE, начиная с "02", также будут пойманы предопределенным исключением NOT FOUND. Если значение не указано, значение SQLSTATE равно 45000.

  • declare_cursor

    Область применения:check помечена да Databricks Runtime 18.1 и выше

    Локальное объявление курсора для итерации результатов запроса.

    Заметка

    Для DECLARE CURSORэтого обнаруживаются и возникают только синтаксические ошибки. Запрос не выполняется, пока курсор не будет открыт с помощью OPEN.

    • cursor_name: неквалифицированное имя курсора, уникальное среди курсоров в этой составной инструкции. При ссылке на курсор в OPEN, FETCH или CLOSE можно присвоить имя курсора с помощью метки составной инструкции (например, label.my_cursorдля диамбигуации в вложенных областях).
    • ASENSITIVE | INSENSITIVE: необязательно. После открытия курсора результирующий набор не влияет на изменения DML. Это поведение по умолчанию и поддерживается только в этом случае.
    • запрос: запрос , определяющий курсор; он выполняется при открытии курсора с помощью OPEN.
  • declare_handler

    Объявление для обработчика ошибок.

    • handler_type

      • EXIT

        Классифицирует обработчик для выхода из составной инструкции после обработки условия. Все курсоры, открытые в составной инструкции и вложенные составные инструкции, неявно закрыты.

      • CONTINUE

        Область применения:check помечена да Databricks Runtime 18.1 и выше

        Классифицирует обработчик, чтобы продолжить выполнение после завершения обработчика. Выполнение возобновляется с помощью инструкции, следующей за той, которая вызвала условие.

    • condition_values

      ** Указывает, на какие sqlstates или условия применяется обработчик. Значения условий должны быть уникальными во всех обработчиках в объединённом блоке. Определенные значения условий имеют приоритет над SQLEXCEPTION.

    • sqlstate

      STRING литерал из 5 символов 'A'-'Z' и '0'-'9' (без учета регистра).

    • condition_name

      Условие, определенное в этом составном операторе, внешнем блоке операторов или системном классе ошибок.

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