サブルーチンは、特定の問題を解決したり、関連する一連のタスクを実行したりするために、多数のSQL文とPL文を含むPLユニットです。 サブルーチンにはパラメータを含めることができ、具体的な値は呼び出し元から渡されます。サブルーチンはストアドプロシージャまたは関数のいずれかになります。典型的な使い方としては、ストアドプロシージャを使用して操作を実行し、関数を使用して値を計算して返すことがあります。
ストアドプロシージャはデータベース内部に格納されるサブルーチンであり、多様なデータベースアプリケーションで複雑な論理演算を実装します。MySQLモードのサブルーチンは独立したプログラム、つまりスキーマ内で作成されるプログラムのみです。
注意
MySQLモードのサブルーチンはSQL標準のストアドプロシージャ規格に準拠しており、Oracleモードのサブルーチン(PL)とは構文や機能において顕著な違いがあります。
サブルーチン構造
サブルーチンの構造はPLブロックの構造と一致しており、以下を含みます:
宣言部(オプション)
宣言部には、型、定数、変数、例外、明示カーソル、ネストされたプログラムの宣言が含まれます。これらの項目はサブルーチンにとってローカルなものであり、サブルーチンの実行終了とともに存在しなくなります。
実行部(必須)
実行部には、代入文、制御文、データ操作文が含まれます。
例外処理部(オプション)
例外処理部には、例外(ランタイムエラー)を処理するコードが含まれます。
サブルーチンにコメントを追加することで、プログラムの可読性を高めることができます。コメントはサブルーチン内の任意の場所に記述でき、コンパイラはコメントを無視します。1行コメントは二重ダッシュ(--)で始まり、行末で終わります。複数行コメントはスラッシュとアスタリスク(/*)で始まり、アスタリスクとスラッシュ(*/)で終わります。
ストアドプロシージャの構造は以下のとおりです:
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
関数の構造は以下のとおりで、ストアドプロシージャと比較して RETURNS 句が追加されています:
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
func_parameter:
param_name type
type:
Any valid MySQL data 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
サブルーチンの利点
クライアントプログラムと比較して、サブルーチンには以下の利点があります:
パフォーマンスの向上
ネットワーク転送によるオーバヘッドを削減します。事前コンパイルやキャッシュメカニズムを利用して、実行時のパフォーマンス消費を低減できます。
メモリ消費の削減
データベースの共有メモリ機構は、複数のユーザーが同一のストアドプロシージャを実行する際のメモリ消費を削減します。
生産性の向上
ストアドプロシージャはユーザーのコードロジックを簡略化し、生産性を向上させます。
セキュリティの向上
ストアドプロシージャの権限情報を指定することで、セキュリティを強化します。
継承性
ユーザーは権限を取得することで、他のユーザーが定義したストアドプロシージャにアクセスできます。
サブプログラムの実行
サブプログラムは以下の3つの方法で実行できます:
MySQLツールを使用する
データベースアプリケーションから呼び出す
別のストアドプロシージャまたはトリガーから呼び出す
サブプログラムのメタデータ
サブプログラム関連のメタデータは以下の方法で取得できます:
INFORMATION_SCHEMAの ROUTINESビューをクエリすることで、すべてのサブプログラムを取得できます。SHOW CREATE PROCEDUREを使用すると、特定のストアドプロシージャの定義を確認できます。SHOW CREATE FUNCTIONを使用すると、特定の関数の定義を確認できます。SHOW CREATE TRIGGERを使用すると、特定のトリガーの定義を確認できます。