Syntax Error.

[Sy] 【技術メモ】MySQLで初めてストアドプロシージャを作ってみた

2014/04/21

今更感がすごいですが、ちょっと仕事で MySQLストアドプロシージャ を作る機会があったのでメモ。

ここでは、サンプルとしてレコード数をただ出力するだけのものを作る手順をまとめました。

1. データベース、テーブルを作成

stored_testというデータベースを作成。

mysql> create database stored_test character set=utf8;
Query OK, 1 row affected (0.00 sec)

id(プライマリキー)と名前を持つ、memberテーブルを作成します。

mysql> create table member
    -> (
    -> id int(11),
    -> name varchar(20),
    -> primary key (id)
    -> );
Query OK, 0 rows affected (0.03 sec)

テーブルのリストを表示して確認。

mysql> show tables;
+-----------------------+
| Tables_in_stored_test |
+-----------------------+
| member                |
+-----------------------+
1 row in set (0.00 sec)

2. とりあえず2件ほどinsert

とりあえずデータを入れときたいので、memberテーブルに適当にinsert。

mysql> insert into member
    -> values
    -> (1, 'utano'),
    -> (2, 'kobayashi');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

select文で確認。

mysql> select * from member;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | utano     |
|  2 | kobayashi |
+----+-----------+
2 rows in set (0.00 sec)

3. レコード数を出力するストアドプロシージャを作成する

ここが本題。

とりあえず、Hello World的な感じで、memberテーブルの_レコード数を出力_するだけの簡単なストアドプロシージャを作ってみます。

その前に、現時点で登録されているストアドプロシージャをリスト表示してみると、

mysql> show procedure status;
Empty set (0.00 sec)

当然まだないです。

では登録してきます。

mysql> create procedure get_member_count()
    -> select count(*) from member;
Query OK, 0 rows affected (0.01 sec)

これでget_member_count()というストアドプロシージャが登録できました。確認してみると、

mysql> show procedure status;
+-------------+------------------+-----------+-------
| Db          | Name             | Type      | ・・・
+-------------+------------------+-----------+-------
| stored_test | get_member_count | PROCEDURE | ・・・
+-------------+------------------+-----------+-------
1 row in set (0.00 sec)

みたいに表示されます。(本当はもっと項目あるけど、長すぎるので省略)

あ、これってDB名があるってことは、すべてのDBのストアドプロシージャが表示されるってことですよね。たぶん。

4. 実行してレコード数を出力させる

登録はできたので、いざ実行。

mysql> call get_member_count();
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

できました。

ストアドプロシージャの基本的な手順はこんな感じです。

関連記事

⇒ [Sy] 【技術メモ】MySQLのストアドプロシージャで引数を扱う ⇒ [Sy] 【技術メモ】MySQLのストアドプロシージャを使ってinsertとかdeleteとかをループさせて実行