Использование составных операторов вне хранимых программ
Составные операторы также могут использоваться вне хранимых программ.
delimiter |
IF @have_innodb THEN
CREATE TABLE IF NOT EXISTS innodb_index_stats (
database_name VARCHAR(64) NOT NULL,
table_name VARCHAR(64) NOT NULL,
index_name VARCHAR(64) NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
stat_name VARCHAR(64) NOT NULL,
stat_value BIGINT UNSIGNED NOT NULL,
sample_size BIGINT UNSIGNED,
stat_description VARCHAR(1024) NOT NULL,
PRIMARY KEY (database_name, table_name, index_name, stat_name)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
END IF|
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Обратите внимание, что использование составных операторов таким образом ограничено следующими условиями:
- Только операторы BEGIN, IF, CASE, LOOP, WHILE, REPEAT могут начинать составной оператор вне хранимых программ.
-
BEGIN должен использовать синтаксис
BEGIN NOT ATOMIC(в противном случае он будет перепутат с оператором BEGIN, который запускает транзакцию). - Составной оператор не может начинаться с метки.
- Составной оператор анализируется полностью — обратите внимание на "2 предупреждения" в приведённом выше примере, даже если условие было ложным (InnoDB действительно был отключен), и оператор CREATE TABLE не был выполнен, он всё равно был проанализирован, и парсер выдал предупреждение "Неизвестный тип хранилища".
Внутри составного блока первые три ограничения не применяются, можно использовать всё, что можно использовать внутри хранимой программы — включая метки, обработчики условий, переменные и так далее:
BEGIN NOT ATOMIC
DECLARE foo CONDITION FOR 1146;
DECLARE x INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SET x=1;
INSERT INTO test.t1 VALUES ("hndlr1", val, 2);
END|
Пример использования IF:
IF (1>0) THEN BEGIN NOT ATOMIC SELECT 1; END ; END IF;;
Пример использования цикла WHILE:
DELIMITER |
BEGIN NOT ATOMIC
DECLARE x INT DEFAULT 0;
WHILE x <= 10 DO
SET x = x + 1;
SELECT x;
END WHILE;
END|
DELIMITER ;
Содержание, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/using-compound-statements-outside-of-stored-programs/