Spec-Zone.ru › MariaDB

Использование составных операторов вне хранимых программ

Составные операторы также могут использоваться вне хранимых программ.

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API