5. PL/SQL パッケージ

 


📝 PL/SQLパッケージ入門:コードを整理して使いやすく!

プログラムが複雑になると、たくさんのプロシージャやファンクションが散らばって、管理が大変になります。まるで、部屋の中にモノがごちゃごちゃと散らかっている状態です。

そんなとき、PL/SQLパッケージを使えば、関連するコードを一つの「フォルダ」にまとめて整理することができます。


1. パッケージって何? 📁

パッケージは、関連するPL/SQLのサブプログラム(プロシージャ、ファンクション)や変数、型などを論理的にグループ化するためのオブジェクトです。

【パッケージのメリット】

  1. 整理整頓(モジュール性): バラバラだったコードを、一つのまとまったグループとして管理できます。

  2. 設計の効率化: 仕様と本体を分けることで、設計段階と実装段階を切り離して進められます。

  3. 情報の隠蔽: どのコードを公開し、どれを内部で使うか(非公開)を明確にできます。

  4. パフォーマンス向上: パッケージ内のサブプログラムを初めて呼び出すと、パッケージ全体がメモリに読み込まれるため、2回目以降の実行が速くなります。


2. パッケージの2つの部分 🧩

パッケージは「仕様(Specification)」と「本体(Body)」の2つの部分からできています。これは、建築でいうところの「設計図」と「実際の建物」の関係に似ています。

部分名役割何を定義する?
仕様 (Specification)「何ができるか」を定義する。パッケージの設計図パッケージ内のプロシージャやファンクションの名前、パラメータ、戻り値など。コードの中身は書きません。
本体 (Body)「どのように動くか」を定義する。パッケージの中身仕様で定義したすべてのプロシージャやファンクションの具体的な実行コード

3. パッケージの作成方法 🏗️

ステップ1:パッケージ仕様の作成

まず、パッケージの「設計図」を作ります。ここでは、どんなプロシージャやファンクションがあるかだけを宣言します。

【構文】

SQL
CREATE OR REPLACE PACKAGE パッケージ名 AS
  -- ここにプロシージャやファンクションのヘッダーを宣言
  PROCEDURE プロシージャ名 (...);
  FUNCTION ファンクション名 (...) RETURN データ型;
END パッケージ名;
/

例:customer_packageというパッケージの仕様を作成する

SQL
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:パッケージ本体の作成

次に、パッケージの「中身」を作ります。ここでは、仕様で宣言したすべてのサブプログラムの詳しいコードを記述します。

【構文】

SQL
CREATE OR REPLACE PACKAGE BODY パッケージ名 AS
  -- ここにプロシージャやファンクションのコード全体を記述
  PROCEDURE プロシージャ名 (...) AS
  BEGIN
    ... -- 実行可能なコード
  END;

  FUNCTION ファンクション名 (...) RETURN データ型 AS
  BEGIN
    ... -- 実行可能なコード
    RETURN ...;
  END;
END パッケージ名;
/

例:customer_packageの本体を作成する

SQL
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のプロシージャを実行する

SQL
BEGIN
  -- display_namesプロシージャを呼び出す(パラメータなし)
  customer_package.display_names;
  
  -- get_customerプロシージャを呼び出す(ID 16を指定)
  customer_package.get_customer(16);
END;
/

このように、パッケージを使うことで、コードが整理され、どの処理がどのグループに属しているか一目瞭然になります。大規模なアプリケーション開発では、パッケージは必須のテクニックです。

前の記事:4. PL/SQL エラー処理

次の記事:6. PL/SQL レコード