IF ステートメント
CASEステートメント
LOOP ステートメント
LEAVE ステートメント
ITERATE ステートメント
REPEAT ステートメント
WHILE ステートメント
IF、CASE, LOOP、WHILE、REPLACE ITERATEおよびLEAVE コンストラクトは完全に実装されます。
これらのコンストラクトの多くには、以下セクションの文法仕様に示すようなその他のステートメントが含まれています。このようなコンストラクトを入れ子とすることができます。例えば、IFステートメントにはそれ自体がCASEステートメントを含むWHILEループが含まれているかもしれません。
FORループは現在サポートされていません。
IF ステートメントIFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list] ... [ELSEstatement_list] END IF
IFは基本条件コンストラクトを施行します。search_conditionが真の場合、該当するSQLステートメントが実行されます。search_conditionが合致しない場合、ELSE節内のステートメントリストが実行されます。各statement_listは複数のステートメントから成り立っています。
注:ここで述べたIFステートメントとは異なるIFファンクションもあります。項11.2. 「制御フロー関数」 を参照してください。
CASEステートメントCASEcase_valueWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list] ... [ELSEstatement_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を使って消去されます。
LOOP ステートメント[begin_label:] LOOPstatement_listEND LOOP [end_label]
LOOPは単純なループコンストラクトを実装します。これによって、複数のステートメントからなるステートメントリストを繰り返して使用することが可能になります。ステートメントのループ内での実行は、ループが閉じられるまで繰り返されます。これは一般的にLEAVEステートメントを使って達成されます。
LOOPステートメントにはラベルを貼ることができます。 begin_labelも存在していない限り、end_labelを附与することはできません。両方が存在する場合、これらは同じでなければなりません。
LEAVE ステートメントLEAVE label
このステートメントは、ラベルを貼ったフローコントロールコンストラクトを閉じるために使用します。それは、BEGIN ......ENDもしくはループコンストラクト(LOOP、REPEAT、WHILE)の中で使うことができます。
ITERATE ステートメントITERATE label
ITERATEはLOOPステートメント、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
REPEAT ステートメント[begin_label:] REPEATstatement_listUNTILsearch_conditionEND 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)
WHILE ステートメント[begin_label:] WHILEsearch_conditionDOstatement_listEND 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