各ストアドプログラムには、SQL ステートメントから構成される本体が含まれます。 このステートメントは、セミコロン (;
) 文字で区切られた複数のステートメントから構成される複合ステートメントの場合があります。 たとえば、次のストアドプロシージャーには、SET
ステートメントと REPEAT
ループ (ループ自体に別の SET
ステートメントが含まれます) を含む BEGIN ... END
ブロックから構成される本体があります。
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @x = 0;
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
mysql クライアントプログラムを使用してセミコロン文字を含むストアドプログラムを定義すると、問題が発生します。 デフォルトでは、mysql 自体はセミコロンをステートメント区切り文字と認識します。したがって、mysql がストアドプログラム定義全体をサーバーに渡すように、区切り文字を一時的に再定義する必要があります。
mysql の区切り文字を再定義するには、delimiter
コマンドを使用します。 次の例は、上記の dorepeat()
プロシージャーについてこれを行う方法を示しています。 区切り文字は //
に変更され、定義全体を単一のステートメントとしてサーバーに渡して、プロシージャーの呼び出し前に ;
にリストアできます。 これにより、プロシージャー本体で使用される ;
区切り文字を、mysql 自体が解釈するのではなく、サーバーに渡すようにすることができます。
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> delimiter ;
mysql> CALL dorepeat(1000);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x;
+------+
| @x |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)
区切り文字を //
以外の文字列に再定義でき、区切り文字は単一の文字から構成することも、複数の文字から構成することもできます。 バックスラッシュ (\
) 文字は、MySQL のエスケープ文字なので使用しないでください。
次に、パラメータを受け取り、SQL 関数を使用して操作を実行したあと、結果を返す関数例を示します。 この場合は、関数定義に内部の ;
ステートメント区切り文字が含まれていないため、delimiter
を使用する必要はありません。
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
-> RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world! |
+----------------+
1 row in set (0.00 sec)