IF
ステートメント
CASE
ステートメント
LOOP
ステートメント
LEAVE
ステートメント
ITERATE
ステートメント
REPEAT
ステートメント
WHILE
ステートメント
IF
、CASE
, LOOP
、WHILE
、REPLACE
ITERATE
およびLEAVE
コンストラクトは完全に実装されます。
これらのコンストラクトの多くには、以下セクションの文法仕様に示すようなその他のステートメントが含まれています。このようなコンストラクトを入れ子とすることができます。例えば、IF
ステートメントにはそれ自体がCASE
ステートメントを含むWHILE
ループが含まれているかもしれません。
FOR
ループは現在サポートされていません。
IF
ステートメントIFsearch_condition
THENstatement_list
[ELSEIFsearch_condition
THENstatement_list
] ... [ELSEstatement_list
] END IF
IF
は基本条件コンストラクトを施行します。search_condition
が真の場合、該当するSQLステートメントが実行されます。search_condition
が合致しない場合、ELSE
節内のステートメントリストが実行されます。各statement_list
は複数のステートメントから成り立っています。
注:ここで述べたIF
ステートメントとは異なるIF
ファンクションもあります。項11.2. 「制御フロー関数」 を参照してください。
CASE
ステートメントCASEcase_value
WHENwhen_value
THENstatement_list
[WHENwhen_value
THENstatement_list
] ... [ELSEstatement_list
] END CASE
または
CASE WHENsearch_condition
THENstatement_list
[WHENsearch_condition
THENstatement_list
] ... [ELSEstatement_list
] END CASE
ストアドルーチンに対するCASE
ステートメントは複雑な条件コンストラクトを実装します。search_condition
が真の場合、該当するSQLステートメントが実行されます。検索条件が合致しない場合、ELSE
節内のステートメントリストが実行されます。各statement_list
は複数のステートメントから成り立っています。
注:ストアドルーチンの内部で使用する目的でここに示したCASE
ステートメントの構文は、 (項11.2. 「制御フロー関数」)で説明されたCASE
表現とは若干異なっています。CASE
ステートメントにELSE NULL
節を含めることはできません。これを持たせると、それは、END
の代わりにEND CASE
を使って消去されます。
LOOP
ステートメント[begin_label
:] LOOPstatement_list
END 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_list
UNTILsearch_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)
WHILE
ステートメント[begin_label
:] WHILEsearch_condition
DOstatement_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