This is a read-only copy of the MariaDB Knowledgebase generated on 2024-12-22. For the latest, interactive version please visit https://mariadb.com/kb/.

Using Compound Statements Outside of Stored Programs

MariaDB starting with 10.1.1

MariaDB 10.1.1 부터 복합문을 저장 프로그램(stored program) 바깥에서도 사용할 수 있습니다.

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 warnings"를 보세요. 만약 조건이 거짓이라 CREATE TABLE이 실행되지 않은 경우에도, 복합문은 여전히 파싱되고 파서는 "Unknown storage engine" 경고(조건이 거짓이니, InnoDB는 당연히 사용 불가능합니다)를 만들어냅니다.

복합 블록 내에서는 처음 세가지 제약조건이 적용되지 않습니다. 레이블, 조건 핸들러, 변수 등 저장 프로그램 내에서 사용가능한 모든 것들이 사용가능합니다.

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 ;
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.