MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法
MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。
ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。
サンプルテーブルの作成
まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。
mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(30) NOT NULL, PRIMARY KEY(id))// Query OK, 0 rows affected (3.87 sec)
最初のストアドプロシージャ(insert1)
次に、テーブルにデータを挿入するストアドプロシージャinsert1()を作成します。
mysql> CREATE PROCEDURE insert1()
-> BEGIN INSERT INTO employee.tbl(name) VALUES ('Ram');
-> END//
Query OK, 0 rows affected (0.10 sec)別のプロシージャを呼び出すストアドプロシージャ(insert2)
続いて作成するinsert2()の中では、先ほどのinsert1()をCALLステートメントで呼び出します。その後、last_insert_id()を使って直前に挿入されたレコードのIDを取得します。
mysql> CREATE PROCEDURE insert2()
-> BEGIN
-> CALL insert1();
-> SELECT last_insert_id();
-> END //
Query OK, 0 rows affected (0.11 sec)
mysql> DELIMITER ;
mysql> CALL insert2();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.36 sec)
Query OK, 0 rows affected (0.37 sec)実行結果の解説
上記の結果セットから、以下の動作が確認できます。insert2()を呼び出すと、その内部でinsert1()が実行され、テーブルemployee.tblに最初の値「Ram」が挿入されます。続いて、2番目のストアドプロシージャであるinsert2()内でlast_insert_id()を実行すると、挿入されたレコードのIDである「1」が出力されます。
このように、CALLステートメントを使えば、ストアドプロシージャから別のストアドプロシージャを簡単に呼び出すことができます。共通の処理を独立したプロシージャとして切り出しておけば、コードの重複を避け、メンテナンス性の高いデータベース設計が可能になります。
-
MySQLのストアドプロシージャ内でSTART TRANSACTIONを実行する方法
MySQLでは、START TRANSACTIONを実行すると新しいトランザクションが開始され、自動コミット(auto-commit)モードがオフに設定されます。これにより、明示的にCOMMITまたはROLLBACKを実行するまで、データの変更内容は確定されません。以下の例では、START TRANSACTIONを含むストアドプロシージャを作成し、employee.tblテーブルに新しいレコードを挿入します。まず、対象となるテーブルには現在、次のデータが格納されています。mysql> Select * from employee.tbl; +----+---------+ | Id |
-
MySQLでSELECTステートメントを使ってストアドプロシージャを呼び出す方法
MySQLでは、FROM句の中でストアドプロシージャを直接指定してSELECTすることはできません。代わりにCALLコマンドを使ってプロシージャを呼び出し、その後でSELECTステートメントを実行して結果を確認する流れになります。この記事では、実際にテーブルとストアドプロシージャを作成し、CALLで呼び出してからSELECTでデータを取得するまでの手順を順番に解説します。1. サンプルテーブルを作成するまずはデータを格納するためのテーブルを作成しましょう。以下の例では、顧客ID・顧客名・出荷日時を持つテーブルを定義しています。mysql> create table DemoTable2