BEGIN END
Синтаксис
[begin_label:] BEGIN [NOT ATOMIC]
[statement_list]
END [end_label]
Ключевое слово `BEGIN` обязательно при использовании вне хранимой процедуры. Внутри хранимых процедур или в анонимном блоке, ключевое слово `BEGIN` само по себе начинает новый анонимный блок.
Описание
Синтаксис `BEGIN ... END` используется для записи составных операторов. Составной оператор может содержать несколько операторов, заключённых между ключевыми словами `BEGIN` и `END`. Список операторов `statement_list` представляет собой список одного или более операторов, каждый из которых завершается точкой с запятой (т.е., `;`). Разделитель списка операторов `statement_list` является необязательным, что означает, что пустой составной оператор (пустой блок) допустим.
Обратите внимание, что выполнение составного оператора `BEGIN ... END` произведёт коммит. Если вы работаете в режиме автоматического коммита, каждый оператор будет коммитирован отдельно. Если вы не работаете в режиме автоматического коммита, вы должны выполнить `COMMIT` или `ROLLBACK` после `BEGIN ... END`, чтобы обновить базу данных.
Использование нескольких операторов требует, чтобы клиент мог отправлять строки операторов, содержащие разделитель `;`. Это обрабатывается в командной строке клиента `mysql` командой `DELIMITER`. Изменение разделителя конца оператора (например, на `$$`) позволяет использовать составные операторы внутри тела программы.
Составной оператор внутри хранимой программы может быть помечен меткой. Метка `label` не может быть указана без `BEGIN ... END`. Если оба присутствуют, они должны быть одинаковыми.
Конструкции `BEGIN ... END` могут быть вложены. Каждый блок может определять свои собственные переменные, курсор и обработчик, которые не существуют во внешних блоках. Самые локальные объявления переопределяют внешние объекты, использующие то же имя (см. пример ниже).
Порядок объявлений следующий:
Обратите внимание, что блок `BEGIN ... END` может содержать другую вложенную конструкцию `BEGIN ... END`.
Вот пример очень простого анонимного блока:
BEGIN NOT ATOMIC SET @a=1; CREATE TABLE test.t1(a INT); END|
Ниже приведен пример вложенных блоков в хранимой процедуре:
CREATE PROCEDURE t( )
BEGIN
DECLARE x TINYINT UNSIGNED DEFAULT 1;
BEGIN
DECLARE x CHAR(2) DEFAULT '02';
DECLARE y TINYINT UNSIGNED DEFAULT 10;
SELECT x, y;
END;
SELECT x;
END;
В этом примере переменная типа `TINYINT`, `x`, объявляется во внешнем блоке. Но во внутреннем блоке `x` повторно объявляется как `CHAR` и объявляется переменная `y`. Внутренний `SELECT` показывает «новое» значение `x` и значение `y`. Но когда `x` выбирается во внешнем блоке, возвращается «старое» значение. Окончательный `SELECT` не пытается прочитать `y`, потому что она не существует в этом контексте.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/begin-end/