ストアドプロシージャ,ファンクション構文
MySQL 5.0以降の機能にストアドプロシージャ、ストアドファンクションが加わりました。
ストアドプロシージャとストアドファンクションの違いは、呼び出し側に戻り値を返すか どうかの違いです。(ちなみに返す方がファンクション)
ストアドプロシージャとは、複数のSQL文をひとまとめにした関数をDB上に保存した り何らかの処理を関数としてDB上に保存できます。
Stored Procedures, Stored Functions 構文について
CREATE PROCEDURE ストアド名 ([引数[,...]])
[characteristic ...]
処理
又は
CREATE PROCEDURE ストアド名 ([引数[,...]])
[characteristic ...]
BEGIN
処理
END
CREATE FUNCTION ストアド名 ([引数[,...]])
RETURNS 戻り値の型
[characteristic ...]
処理
又は
CREATE FUNCTION ストアド名 ([引数[,...]])
RETURNS 戻り値の型
[characteristic ...]
BEGIN
処理
END
引数は、入力用、出力用、入出力用の特性、名称、型を指定します。
[ IN | OUT | INOUT ] 引数名 型
単純なストアドプロシージャ
ストアドプロシージャを作成する時、処理部に SQL 文の終了である;(セミコロン)を 記述します。そのままだとそこで終了とみなされるので終了の区切りをdelimiter // として//に変更します。
mysql> delimiter //
mysql> CREATE PROCEDURE PROC_USERCOUNT (OUT ucount INT)
-> BEGIN
-> SELECT COUNT(*) INTO ucount FROM mysql.user;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
ストアドプロシージャを使うには、次のように CALL を使用します。
mysql> CALL PROC_USERCOUNT(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
単純なストアドファンクション
プロシージャとの違いは、戻り値の有無です。
mysql> delimiter //
mysql> CREATE FUNCTION hello() RETURNS CHAR(50)
-> BEGIN
-> RETURN CONCAT('Hello, ',CURRENT_USER(),'!');
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
ストアドファンクションを使うには、次のようにします。
mysql> SELECT hello();
+--------------------------+
| hello() |
+--------------------------+
| Hello, bnote@localhost! |
+--------------------------+
1 row in set (0.00 sec)