【MySQL】プロシージャ新規作成編

スポンサーリンク

MySQLのストアドプロシージャを作成する機会がありましたので、勉強したことをまとめます。

ストアドプロシージャとは

ざっくり言うと「複数のSQLを一回の呼び出しで実行できる」機能です。

ケースバイケースですが、僕の経験上では以下の用途で利用していました。

  • サマリテーブルへの処理
  • 複数のテーブルへの処理

複数のテーブルへの処理を行うときに便利です。整合性を保つ目的もありますので、データ作業を行うときにも処理の流れを再確認できます。

例えば社員情報を登録するときを考えると、社員テーブル、住所テーブルやシステムの操作権限テーブルなどに一回の呼び出しで登録できます。

クライアント側からテーブルごとに登録処理を発行しなくて済みます。

プロシージャ定義の事前知識

以下の構文でプロシージャを定義できます。

delimiter //

CREATE PROCEDURE プロシージャ名()
BEGIN

SELECT * FROM テーブル;

END
//

delimiter ;

delimiterについて

SQLを複数実行できるプロシージャでセミコロンを使ってしまうと、プロシージャ定義の途中で「ここで定義は終わり!」とMySQLが認識してしまい、最後まで定義できなくなってしまいます。

そのため、delimiterをプロシージャ定義の間だけ、セミコロン以外に変更してあげる必要があります。

※例では「//」にしています。もちろん最後に「delimiter ;」で戻してあげる作業も必要です。

「delimiter」で定義しないと、以下のように途中でエラーになってしまいます。

MariaDB [test2]> CREATE PROCEDURE pro_test()
-> BEGIN
->
-> SELECT * FROM movies;←プロシージャの定義はここまで!とMySQlが認識してしまいます。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 4
MariaDB [test2]>

プロシージャを定義

シンプルなプロシージャを定義していみます。

MariaDB [test2]> delimiter //
MariaDB [test2]>
MariaDB [test2]> CREATE PROCEDURE pro_test()
-> BEGIN
->
-> SELECT * FROM movies;
->
-> END
-> //
Query OK, 0 rows affected (0.24 sec)

MariaDB [test2]>
MariaDB [test2]> delimiter ;

呼び出し方法

call プロシージャ名」で呼び出しができます。

実際に呼び出してみます。

MariaDB [test2]> call pro_test();
+----+-----------+-----------------------+-------+---------------------+
| id | title    | content      | stars | created |
+----+-----------+-----------------------+-------+---------------------+
| 1 | title     | テストコメント | 1     | 0000-00-00 00:00:00 |
| 2 | NULL      | コメント      | 1     | 2019-06-19 20:29:09 |
| 3 | testtitle | おもしろい    | 1      | 2019-06-23 17:21:52 |
+----+-----------+-----------------------+-------+---------------------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

MariaDB [test2]>

以上です。プロシージャの更新方法もまとめていますので、良ければご参考ください。

 

タイトルとURLをコピーしました