MySQLストアドプロシージャでユーザー変数を使う方法をわかりやすく解説
MySQLのストアドプロシージャでは、ユーザー変数(ユーザー定義変数)を利用することで、セッション単位で値を保持し、複数のSQL文の間でデータを受け渡すことができます。本記事では、ストアドプロシージャ内でのユーザー変数の基本的な使い方を、実際のコード例とともに解説します。
ユーザー変数とは
MySQLにおけるユーザー変数は、変数名の先頭に「@」(アットマーク)を付けて表現します。たとえば @A や @B のような形式がユーザー変数に該当します。ローカル変数(DECLAREで宣言する変数)と異なり、宣言なしでそのまま使用でき、値はセッションが終了するまで保持されます。
ユーザー変数の主な特徴
- 先頭に「@」を付けて識別する
- SET文やSELECT文を使って値を代入できる
- セッション内であれば、プロシージャの外でも参照可能
- 事前の型宣言が不要(代入時に自動的に型が決まる)
ストアドプロシージャでの使用例
それでは、実際にユーザー変数を使用するストアドプロシージャを作成してみましょう。以下の例では、@A に 100、@B に 500 を代入し、その値と合計値をSELECT文で表示しています。
mysql> DELIMITER // ;
mysql> CREATE PROCEDURE Proc_Uservariables()
-> BEGIN
-> SET @A = 100;
-> SET @B = 500;
-> SELECT @A, @B, @A + @B;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ; //プロシージャを作成したら、CALL文で呼び出して実行します。
mysql> CALL Proc_Uservariables(); +------+------+-------+ | @A | @B | @A+@B | +------+------+-------+ | 100 | 500 | 600 | +------+------+-------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
実行結果のポイント
実行結果を見ると、@A には 100、@B には 500 が格納され、@A + @B の計算結果として 600 が返されていることがわかります。このように、ユーザー変数は代入した値をそのまま演算に使えるため、柔軟な処理が可能です。
注意点
- ユーザー変数の値は接続(セッション)ごとに独立しており、他の接続からは参照できません。
- 大文字・小文字は区別されません(
@aと@Aは同じ変数として扱われます)。 - 未初期化のユーザー変数を参照すると NULL が返るため、使用前に必ず値を代入しましょう。
まとめ
MySQLのストアドプロシージャでは、「@」を付けた名前でユーザー変数を簡単に扱うことができます。SET文で値を代入し、SELECT文や演算式の中で自由に参照できるため、一時的な値の保持や計算処理に非常に便利です。ただし、スコープがセッション単位である点や、未初期化時にNULLになる点には注意して使用してください。
-
MySQLのストアドプロシージャ内でSTART TRANSACTIONを実行する方法
MySQLでは、START TRANSACTIONを実行すると新しいトランザクションが開始され、自動コミット(auto-commit)モードがオフに設定されます。これにより、明示的にCOMMITまたはROLLBACKを実行するまで、データの変更内容は確定されません。以下の例では、START TRANSACTIONを含むストアドプロシージャを作成し、employee.tblテーブルに新しいレコードを挿入します。まず、対象となるテーブルには現在、次のデータが格納されています。mysql> Select * from employee.tbl; +----+---------+ | Id |
-
MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法
MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。サンプルテーブルの作成まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO