e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第29回 「パッケージでできること オーバーロード(同名のサブプログラム定義)」

2012.07.23

パッケージは単にプロシージャやファンクションをまとめる機能だけでなく、以前少し触れたように、パッケージ化することで初めて可能になる機能があります。
今回は、そういったパッケージを使って可能になる機能について解説します。

いわばパッケージを使って「こんなことができる!」というものです。

今回はその第一弾として、パッケージを使えば同名のプロシージャ・ファンクションを複数作成できることをご紹介します。

例えば、プロシージャなどを作成するときに、同じ内容の処理なのに、パラメータの型や数が違うために、やむなく別プロシージャとして作成する場合がありませんか?
その場合、ほんの少し違う名前でプロシージャを作成したりすることでしょう。
でも同じ内容の処理であれば、パラメータのデータ型などが多少違っても、同じ名前でコールできれば開発者や利用者の立場としては便利ですよね。

まさにそんな時、パッケージを使えば同じ名前のプロシージャを複数作成できるので大変便利です。
同じ名前のサブプログラムを複数定義することをオーバーロードと言います。
PL/SQLではパッケージ化することでオーバーロードが可能です。

同じ名前とはいっても、何かで区別をしなければいけません。
この場合、パラメータの数やデータ型の違い、またファンクションの時はさらにリターンするデータ型などの違いで区別できます。
そして、それらのプロシージャやファンクションが実際にコールされるときにそこにセットされているパラメータをみて、同名のプロシージャのどれがコールされたかをシステム側で自動的に判断し、そのコードが実行されるわけです。

以下に簡単な例を示します。

<<パッケージ仕様部の作成例>>
SQL> CREATE OR REPLACE PACKAGE PAC1
  2  IS
  3  /* 同じ名前のプロシージャ3つ ただしパラメータの型や数が違う*/
  4   PROCEDURE PROC1 ( P1 IN NUMBER);
  5   PROCEDURE PROC1 ( P1 IN VARCHAR2);
  6   PROCEDURE PROC1 ( P1 IN VARCHAR2, P2 IN NUMBER);
  7  END PAC1;
  8  /

パッケージが作成されました。

<<パッケージ本体の作成例>>
SQL> CREATE OR REPLACE PACKAGE BODY PAC1
  2 IS
  3      /** 1つめのPROC1プロシージャ **/
  4      PROCEDURE PROC1 ( P1 IN NUMBER)
  5      IS
  6      BEGIN
  7         DBMS_OUTPUT.PUT_LINE('Version 1');
  8      END;
  9      /** 2つめのPROC1プロシージャ **/
10      PROCEDURE PROC1 ( P1 IN VARCHAR2)
11      IS
12      BEGIN
13         DBMS_OUTPUT.PUT_LINE('Version 2');
14      END;
15      /** 3つめのPROC1プロシージャ **/
16      PROCEDURE PROC1 ( P1 IN VARCHAR2, P2 IN NUMBER)
17      IS
18      BEGIN
19         DBMS_OUTPUT.PUT_LINE('Version 3');
20      END;
21  END PAC1;
22  /

パッケージ本体が作成されました。

<<それぞれのパッケージプロシージャの実行例 >>
SQL> SET SERVEROUTPUT ON
SQL> EXEC PAC1.PROC1(123)  ←パラメータに数値を指定
Version 1      ←結果

PL/SQLプロシージャが正常に完了しました。

SQL> EXEC PAC1.PROC1('ABC')  ←パラメータに文字を指定
Version 2      ←結果

PL/SQLプロシージャが正常に完了しました。

SQL> EXEC PAC1.PROC1('XYZ',321)  ←パラメータに文字と数値を指定
Version 3      ←結果

PL/SQLプロシージャが正常に完了しました。

いかがですか?簡単に解説します。

まず、パッケージ仕様部で、PROC1プロシージャを3つ宣言してますが、それぞれパラメータのデータ型や数が違っています。

次にパッケージ本体でそれぞれのPROC1プロシージャを完全に定義してます。
ここではそれぞれ、「Version 1」、「Version 2」、「Version 3」のメッセージを画面に表示する処理内容です。

そして、実行例では、パラメータのセットのされ方により、それぞれ結果の表示が違っていることがわかります。
つまりパラメータのセットのされ方により、システム側でどのバージョンがコールされたのかを自動判断していることが判ると思います。

このように、パッケージを使えば、同じ名前のサブプログラム(プロシージャ、ファンクション)であっても定義可能なのです。

いかがですか? パッケージの利点を感じていただけましたか?

次回も引き続き、パッケージでできることを紹介します。ご期待ください。

先頭へ戻る