MySQLストアドプロシージャでDELIMITERを正しく使う方法――BEGIN/ENDステートメントのエラーを回避するには
はじめに
MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の概念を正しく理解せずに記述すると、BEGIN/ENDステートメントに関連するエラーが発生することがあります。本記事では、DELIMITERを正しく使用してストアドプロシージャを作成・実行する手順を、具体例とともに解説します。
なぜDELIMITERが必要なのか
MySQLクライアントは通常、セミコロン(;)を文の終わりとして解釈します。しかし、ストアドプロシージャの本体である BEGIN ... END の内部にもセミコロンが含まれるため、そのまま入力すると文が途中で分割されてしまい、構文エラーの原因になります。そこで DELIMITER コマンドを使って一時的に区切り文字を変更し、プロシージャ全体をひとつのまとまりとして MySQL に渡す必要があります。
DELIMITERを使った正しい作成例
mysql> DELIMITER //
mysql> CREATE PROCEDURE correct_procedure()
BEGIN
SELECT 'Hello MySQL !!!';
END
//
Query OK, 0 rows affected (0.12 sec)
mysql> DELIMITER ;
この例では、まず「DELIMITER //」で区切り文字を「//」に変更しています。これにより、プロシージャ本体内のセミコロンが文の終端とみなされず、ENDの後ろの「//」までがひとつの命令として処理されます。作成が完了したら、「DELIMITER ;」で区切り文字を元のセミコロンへ戻すことを忘れないようにしましょう。
ストアドプロシージャの呼び出し方
作成したストアドプロシージャは、CALLコマンドを使って呼び出します。基本の構文は以下の通りです。
call yourStoredProcedureName();
それでは、先ほど作成したプロシージャを実際に呼び出してみましょう。
mysql> call correct_procedure();
実行結果
+-----------------+
| Hello MySQL !!! |
+-----------------+
| Hello MySQL !!! |
+-----------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
このように、SELECT文の結果として「Hello MySQL !!!」が出力されます。DELIMITERを正しく扱えば、BEGIN/ENDステートメントを含むストアドプロシージャもエラーなく定義できます。
まとめ
- プロシージャ本体内のセミコロンとSQL文の終端を区別するため、DELIMITERで区切り文字を変更する
- 作成完了後は必ず「DELIMITER ;」で元の設定に戻す
- プロシージャの実行にはCALLコマンドを使用する
-
MySQLストアドプロシージャでIN()を使って特定のレコードのみを取得する方法
MySQLのストアドプロシージャ内でIN()を使用すると、条件に一致する特定のレコードだけを柔軟に取得できます。ここでは、実際の手順をサンプルコードとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable2004 ( UserId varchar(20), UserName varchar(20) ); Query OK, 0 rows affected (0.57 sec)2. レコードの挿入次に、INSERTコマンドを使ってテーブルにレコードを挿入します。mysql> insert i
-
MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法
MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable