サブルーチンとは、特定の問題を解決したり、関連する一連のタスクを実行したりするために、多数のSQL文やPL文を含むPLユニットです。
サブルーチンにはパラメータを含めることができ、具体的な値は呼び出し元から渡されます。サブルーチンはストアドプロシージャまたは関数のいずれかになります。典型的な使い方としては、ストアドプロシージャを用いて操作を行い、関数を用いて計算を行って値を返すことが挙げられます。
ストアドサブルーチンとは、データベース内部に格納されるサブルーチンであり、さまざまなデータベースアプリケーションで複雑な論理演算を実現します。ストアドサブルーチンには以下の3種類があります:
独立サブルーチン:スキーマ内に作成されるサブルーチンです。
パッケージ内部サブルーチン:パッケージ本体内部に作成されるサブルーチンです。
ネストサブルーチン:PLブロック内に作成されるサブルーチンです。
独立サブルーチンはプログラムロジックのテストに便利ですが、大量のサブルーチンは管理が難しいという点があります。そのため、プログラムロジックが確定した後、独立サブルーチンを業務モジュールごとに異なるパッケージに配置することを推奨します。
サブルーチンは、プログラムパッケージやトリガーなど、他の保守性機能の重要な構成要素でもあります。
サブルーチンの構造
サブルーチンはサブルーチンのヘッダーで始まり、このヘッダーにはその名前とパラメータリスト(オプション)が指定されます。
サブルーチンの構造はPLブロックの構造と一致しており、以下を含みます:
宣言部(オプション)
宣言部には、型、定数、変数、例外、明示カーソル、ネストサブルーチンの宣言が含まれます。これらの項目はサブルーチンにとってローカルであり、サブルーチンの実行終了時にはすべて存在しなくなります。
実行部(必須)
実行部には代入文、制御実行文、データ操作文が含まれます。
例外処理部(オプション)
例外処理部には、例外(ランタイムエラー)を処理するコードが含まれます。
サブルーチンにコメントを追加することでプログラムの可読性が向上します。コメントはサブルーチンの任意の位置に記述でき、コンパイラはコメントを無視します。1行コメントは二重のハイフン(--)で始まり、コメント範囲は行末で終了します。複数行コメントはスラッシュとアスタリスク(/)で始まり、アスタリスクとスラッシュ(/)で終了します。
ストアドプロシージャの構造は以下のとおりです:
PROCEDURE name [ ( parameter_list ) ]
{ IS | AS }
[ declarative_part ]
BEGIN -- 実行開始部分
statement; [ statement; ]...
[ EXCEPTION ]
exception_handler; [ exception_handler; ]... ]
END;
関数の構造は以下のとおりで、ストアドプロシージャと比較して、1つ以上のRETURN句が追加されています:
FUNCTION name [ ( parameter_list ) ] RETURN data_type [ clauses ]
{ IS | AS }
[ declarative_part ]
BEGIN
statement; [ statement; ]...
[ EXCEPTION ]
exception_handler; [ exception_handler; ]... ]
END;
ストアドプロシージャと関数のIS | ASの間のコードはサブルーチンの宣言であり、宣言部、実行部、例外処理部がサブルーチンの内容体です。
サブルーチンの利点
クライアントプログラムと比較して、サブルーチンには以下のような利点があります:
パフォーマンスの向上
ネットワーク転送によるコストを削減できます。事前にコンパイルしたり、キャッシュメカニズムを利用してキャッシュしたりすることで、実行時のパフォーマンス消費を低減できます。
メモリ消費の削減
データベースの共有メモリメカニズムにより、複数のユーザーが同一のストアドプロシージャを実行する際のメモリ消費が削減されます。
生産性の向上
ストアドプロシージャはユーザーのコードロジックを簡素化し、ユーザーの生産性を向上させます。
セキュリティの向上
ストアドプロシージャの権限情報を指定することで、セキュリティが向上します。
継承性を持つ
ユーザーは権限を取得することで、他のユーザーが定義したストアドプロシージャにアクセスできます。
サブルーチンの実行
サブルーチンは以下の3つの方法で実行できます:
クライアントツール(OBClient)を使用する
アプリケーション内で直接サブルーチンを呼び出す
サブルーチンまたはトリガー内で呼び出す
依存関係管理
サブルーチンのパッケージ本体でインポートされるオブジェクトは、サブルーチンの依存オブジェクトを構成します。データベースはこれらの依存関係を自動的に追跡および管理します。
例えば、ユーザーがサブルーチンが依存するテーブル定義を変更した場合、サブルーチンは再コンパイルされて、依然として有効であるかどうかを判断する必要があります。通常、このような依存関係の変更後のサブルーチンの再コンパイルは、データベースの依存関係管理ユニットによって自動的に完了します。