ステートメントプロシージャとは、直接値を返さないサブルーチンのことです。パラメータタイプがOUTの場合、ステートメントプロシージャは呼び出し元に値を返すこともできます。
ステートメントプロシージャの構造
ステートメントプロシージャの構造は以下のとおりです:
CREATE
[DEFINER = user]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
Valid SQL routine statement
ステートメントプロシージャの作成
ステートメントプロシージャは CREATE PROCEDURE ステートメントを使用して作成します。MySQLモードとOracleモードの違いは以下のとおりです:
DECLAREブロックはBEGIN END;ブロック内に配置する必要があり、すべての定義宣言が完了してから他のステートメントを定義できます。DETERMINISTIC / LANGUAGE SQLなどのsp_create_chistic情報を定義することで、ステートメントプロシージャの使い勝手を豊かにできます。
MySQLモードではステートメントプロシージャのオーバーロードは存在しないため、削除時にパラメータタイプを考慮する必要はありません。
例:
obclient> DELIMITER /
obclient> CREATE TABLE city(CountryCode CHAR(3))/
Query OK, 0 rows affected
obclient> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
BEGIN
SELECT COUNT(*) INTO cities FROM city
WHERE CountryCode = country;
END/
Query OK, 0 rows affected
ステートメントプロシージャの呼び出し
作成したステートメントプロシージャは、CALL ステートメントを使用して呼び出す必要がありますが、SQL式の一部として呼び出すことはできません。
obclient> CALL citycount('JPN', @cities);/
+--------+
| cities |
+--------+
| 0 |
+--------+
1 row in set
obclient> SELECT @cities/
+---------+
| @cities |
+---------+
| 0 |
+---------+
1 row in set
obclient> DROP PROCEDURE citycount/
Query OK, 0 rows affected