サブプログラムは、特定の問題を解決したり、関連する一連のタスクを実行したりするために、多数の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を実行することで、特定のトリガーの定義を確認できます。