Help us understand the problem. What is going on with this article?

【MySQL】ストアドプロシージャー①

More than 3 years have passed since last update.

MySQLのストアドプロシージャについてまとめます。

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

複数のSQL文をまとめて、名前を付けて関数のように呼び出せる。

シンプルなストアドプロシージャの作成の例

1  mysql> delimiter //                        
2  mysql> create procedure sample()      
3      -> begin                               
4      ->   select * from User;
5      -> end                                 
6      -> //
7  Query OK, 0 rows affected (0.00 sec)
8
9  mysql> delimiter ;                             

L1 delimiterの変更

delimiterとは終端文字のことです。
MySQLでは終端文字が;に設定されており、;があった時点でそこまでが実行されてしまいます。
上記のコードはストアドプロシージャの作成を行っていますが、delimiterを変更しないと、L4でこのスクリプト(CREATE PROCEDURE)が実行されてしまいます。
そのため、最初にdelimiterを変更し、作成が終わったらL9でdelimiterをもとに戻しています。

L2 ストアドプロシージャの作成

create procedure <PROCEDURE_NAME>でストアドプロシージャの作成を行います。

L3~L5 ストアドプロシージャの本体

begin~endの間にストアドプロシージャの本体を書きます。
今回はL4の1行ですが、複数行のSQLを書くことができます。

L6 終端

終端文字(delimiter)がL1で//に設定されていますので、ここでcreate procedureが実行されます。

L9 delimiterの変更

delimiterを元に戻します。

ストアドプロシージャの呼び出し

1  mysql> call sample();

call <PROCEDURE_NAME>()で作成したストアドプロシージャを呼び出すことができます。

ストアドプロシージャへの操作

ストアドプロシージャの確認

show create procedure <PROCEDURE_NAME>;

ストアドプロシージャの削除

drop procedure <PROCEDURE_NAME>;

ストアドプロシージャの書き方

以下、delimiterの設定等は省略します。

引数ありのストアドプロシージャを作成する

引数に設定されたIDを持つuserを取得するストアドプロシージャを作ります。

1  mysql> create procedure sample(IN id INT)      
2      -> begin                               
3      ->   select * from User where ID = id;
4      -> end                                 
5      -> //

引数の場合は定義にIN <INPUT_NAME> <DATA_TYPE>が必要になります(L1)。
これで、idという名のINT型の引数を定義することができます。

1  mysql> call sample(10);

上記のように呼び出すことができます。

出力をするストアドプロシージャを作成する

出力引数を持つストアドプロシージャも作成することができます。
ストアドプロシージャの実行後、ストアドプロシージャの外からアクセスすることができます。

1  mysql> create procedure sample(OUT res INT)      
2      -> begin                               
3      ->   select count(*) from User into res;
4      -> end                                 
5      -> //

出力引数の場合は、定義にOUT <OUTPUT_NAME> <DATA_TYPE>が必要です(L1)。
L3のように・・・into <OUTPUT_NAME>で出力変数に値を格納できます。

1  mysql> call sample(res);
2  mysql> select res;

実行時の引数に変数を渡し、select <OUTPUT_NAME>でストアドプロシージャ内で、出力変数に格納された値を出力できます。

chihiro
jrits
信頼と魅力のある先進のITをもとに、お客様のワークスタイル・イノベーションの実現を目指します。
http://www.jrits.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした