📝 PL/SQLパッケージ入門:コードを整理して使いやすく!
プログラムが複雑になると、たくさんのプロシージャやファンクションが散らばって、管理が大変になります。まるで、部屋の中にモノがごちゃごちゃと散らかっている状態です。
そんなとき、PL/SQLパッケージを使えば、関連するコードを一つの「フォルダ」にまとめて整理することができます。
1. パッケージって何? 📁
パッケージは、関連するPL/SQLのサブプログラム(プロシージャ、ファンクション)や変数、型などを論理的にグループ化するためのオブジェクトです。
【パッケージのメリット】
整理整頓(モジュール性): バラバラだったコードを、一つのまとまったグループとして管理できます。
設計の効率化: 仕様と本体を分けることで、設計段階と実装段階を切り離して進められます。
情報の隠蔽: どのコードを公開し、どれを内部で使うか(非公開)を明確にできます。
パフォーマンス向上: パッケージ内のサブプログラムを初めて呼び出すと、パッケージ全体がメモリに読み込まれるため、2回目以降の実行が速くなります。
2. パッケージの2つの部分 🧩
パッケージは「仕様(Specification)」と「本体(Body)」の2つの部分からできています。これは、建築でいうところの「設計図」と「実際の建物」の関係に似ています。
3. パッケージの作成方法 🏗️
ステップ1:パッケージ仕様の作成
まず、パッケージの「設計図」を作ります。ここでは、どんなプロシージャやファンクションがあるかだけを宣言します。
【構文】
CREATE OR REPLACE PACKAGE パッケージ名 AS
-- ここにプロシージャやファンクションのヘッダーを宣言
PROCEDURE プロシージャ名 (...);
FUNCTION ファンクション名 (...) RETURN データ型;
END パッケージ名;
/
例:customer_packageというパッケージの仕様を作成する
CREATE OR REPLACE PACKAGE customer_package AS
PROCEDURE add_customer (...);
PROCEDURE display_names;
PROCEDURE get_customer (...);
PROCEDURE show_customer (...);
FUNCTION find_salescount (...) RETURN NUMBER;
FUNCTION get_names (...) RETURN VARCHAR2;
END customer_package;
/
このコードを実行すると、customer_packageという名前のパッケージがデータベースに作成されます。この時点では、中身は空っぽです。
ステップ2:パッケージ本体の作成
次に、パッケージの「中身」を作ります。ここでは、仕様で宣言したすべてのサブプログラムの詳しいコードを記述します。
【構文】
CREATE OR REPLACE PACKAGE BODY パッケージ名 AS
-- ここにプロシージャやファンクションのコード全体を記述
PROCEDURE プロシージャ名 (...) AS
BEGIN
... -- 実行可能なコード
END;
FUNCTION ファンクション名 (...) RETURN データ型 AS
BEGIN
... -- 実行可能なコード
RETURN ...;
END;
END パッケージ名;
/
例:customer_packageの本体を作成する
CREATE OR REPLACE PACKAGE BODY customer_package AS
-- add_customerプロシージャの全コード
PROCEDURE add_customer (...) AS
BEGIN
...
END;
-- display_namesプロシージャの全コード
PROCEDURE display_names AS
BEGIN
...
END;
-- ...すべてのサブプログラムのコードをここに記述...
END customer_package;
/
このコードを実行すると、customer_packageというパッケージの本体が作成され、中身が完成します。
4. パッケージ内のコードを実行する 🚀
パッケージ内のプロシージャやファンクションを呼び出すには、パッケージ名.サブプログラム名という形式を使います。
【構文】
プロシージャの呼び出し:
BEGIN パッケージ名.プロシージャ名(...); END;ファンクションの呼び出し:
SELECT パッケージ名.ファンクション名(...) FROM DUAL;
例:customer_packageのプロシージャを実行する
BEGIN
-- display_namesプロシージャを呼び出す(パラメータなし)
customer_package.display_names;
-- get_customerプロシージャを呼び出す(ID 16を指定)
customer_package.get_customer(16);
END;
/
このように、パッケージを使うことで、コードが整理され、どの処理がどのグループに属しているか一目瞭然になります。大規模なアプリケーション開発では、パッケージは必須のテクニックです。
