フローコントロール・コンストラクト

1. IF ステートメント
2. CASEステートメント
3. LOOP ステートメント
4. LEAVE ステートメント
5. ITERATE ステートメント
6. REPEAT ステートメント
7. WHILE ステートメント

IFCASE, LOOPWHILEREPLACE ITERATEおよびLEAVE コンストラクトは完全に実装されます。

これらのコンストラクトの多くには、以下セクションの文法仕様に示すようなその他のステートメントが含まれています。このようなコンストラクトを入れ子とすることができます。例えば、IFステートメントにはそれ自体がCASEステートメントを含むWHILEループが含まれているかもしれません。

FORループは現在サポートされていません。

1. IF ステートメント

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

IFは基本条件コンストラクトを施行します。search_conditionが真の場合、該当するSQLステートメントが実行されます。search_conditionが合致しない場合、ELSE節内のステートメントリストが実行されます。各statement_listは複数のステートメントから成り立っています。

:ここで述べたIFステートメントとは異なるIFファンクションもあります。項11.2. 「制御フロー関数」 を参照してください。

2. CASEステートメント

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

または

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

ストアドルーチンに対するCASEステートメントは複雑な条件コンストラクトを実装します。search_conditionが真の場合、該当するSQLステートメントが実行されます。検索条件が合致しない場合、ELSE節内のステートメントリストが実行されます。各statement_listは複数のステートメントから成り立っています。

:ストアドルーチンの内部で使用する目的でここに示したCASEステートメントの構文は、 (項11.2. 「制御フロー関数」)で説明されたCASE表現とは若干異なっています。CASE ステートメントにELSE NULL節を含めることはできません。これを持たせると、それは、ENDの代わりにEND CASEを使って消去されます。

3. LOOP ステートメント

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

LOOPは単純なループコンストラクトを実装します。これによって、複数のステートメントからなるステートメントリストを繰り返して使用することが可能になります。ステートメントのループ内での実行は、ループが閉じられるまで繰り返されます。これは一般的にLEAVEステートメントを使って達成されます。

LOOPステートメントにはラベルを貼ることができます。 begin_labelも存在していない限り、end_labelを附与することはできません。両方が存在する場合、これらは同じでなければなりません。

4. LEAVE ステートメント

LEAVE label

このステートメントは、ラベルを貼ったフローコントロールコンストラクトを閉じるために使用します。それは、BEGIN ......ENDもしくはループコンストラクト(LOOPREPEATWHILE)の中で使うことができます。

5. ITERATE ステートメント

ITERATE label

ITERATELOOPステートメント、REPEATステートメント並びにWHILEステートメントの中にだけ現れます。ITERATEは「再びループを実行」を意味します。

例:

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
  label1: LOOP
    SET p1 = p1 + 1;
    IF p1 < 10 THEN ITERATE label1; END IF;
    LEAVE label1;
  END LOOP label1;
  SET @x = p1;
END

6. REPEAT ステートメント

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

REPEATステートメント中のステートメントリストは、search_conditionが真になるまで繰り返されます。このようにして、REPEAT は常に、少なくとも1回入力ループを書き込みます。 statement_list は複数のステートメントから成り立っています。

REPEATステートメントにはラベルを貼ることができます。begin_label がなければ、end_label を与える事はできません。両方が存在する場合、これらは同じでなければなりません。

例:

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> CALL dorepeat(1000)//
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x//
+------+
| @x   |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

7. WHILE ステートメント

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

WHILEステートメント中のステートメントリストは、search_conditionが真になるまで繰り返されます。 statement_listは複数のステートメントから成り立っています。

CHECK WHILEステートメントにはラベルを貼ることができます。 begin_labelも存在していない限り、end_labelを附与することはできません。両方が存在する場合、これらは同じでなければなりません。

例:

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;

  WHILE v1 > 0 DO
    ...
    SET v1 = v1 - 1;
  END WHILE;
END