ストアドプロシージャは、直接戻り値を持たないサブルーチンです。パラメータタイプが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