ストアドプロシージャ,ファンクション構文

MySQL5.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)
[an error occurred while processing this directive]