ここではパッケージウィザードの使い方について説明します。

DOAのパッケージウィザードは、Oracleのパッケージ関数をアプリケーションから直接利用するために、以下の性質を持つクラス定義を自動的に行います。

  • Oracleのパッケージを、Delphiのクラスに対応させる
  • パッケージプロシージャは、クラスのメンバ
    procedure に、
  • パッケージファンクションは、クラスのメンバ
    function に、対応づけられる
  • 各Oracleプロシージャの
    引数が、Delphiクラスのメンバプロシージャにおいて、適当なデータ型の
    引数に対応づけられる
  • %typeを使って宣言されたパッケージプロシージャの引数の型が、Delphiデータ型に対応づけられる
  • %rowtypeを使って宣言されたパッケージプロシージャの引数がある場合、このレコード型にDelphiのクラスが対応づけられる

Oracleのパッケージプロシージャを利用するには、TOracleQueryでPL/SQLを記述する方法や、TOraclePackageのCallProcedureメソッドを呼ぶ方法もありますが、パッケージプロシージャの引数のデータ型や順番を間違えていた場合、設計時に気が付くことはできず、実行時にORACLEからエラーが返されてしまいます。

パッケージウィザードを使って、パッケージに対応するクラスを作成することで、引数の順番やデータ型が違っているとコンパイル時にエラーが判明するようになりますし、Delphi/IDEのコード補完機能を利用することで、コーディングの生産性向上が見込めます。

例:パッケージウィザードを使ってみる

以下のように宣言されたパッケージが有るとします。

  create or replace package Department is
    function  Employee_Count(Deptno in dept.deptno%type) return binary_integer;
    procedure Select_Record(Dept_Record in out dept%rowtype);
    procedure Insert_Record(Dept_Record in dept%rowtype);
    procedure Update_Record(Dept_Record in dept%rowtype);
    procedure Delete_Record(Deptno in dept.deptno%type);
    procedure Get_Description(Deptno in dept.deptno%type, Description out CLOB);
  end Department; 

DOAをインストールすると、Delphiのメニューに「Oracle」が追加されていますが、ここから、「Oracle」「Package
Wizard」を選択してパッケージウィザードを起動し、Departmentパッケージを選択するだけで、以下のようなクラス定義が自動生成されます

  type
    DeptRowtype = class(TPLSQLRecord)
    public
      Deptno: Integer;
      Dname: string;
      Loc: string;
      procedure Assign(Source: TPLSQLRecord); override;
    end;
    TDepartment = class(TOracleCustomPackage)
    public
      function  EmployeeCount(Deptno: Integer): Integer;
      procedure SelectRecord(var DeptRecord: DeptRowtype);
      procedure InsertRecord(DeptRecord: DeptRowtype);

      procedure UpdateRecord(DeptRecord: DeptRowtype);
      procedure DeleteRecord(Deptno: Integer);
      procedure GetDescription(Deptno: Integer; out Description: TLOBLocator);
    published
      property Name;
      property Session;
      property Cursor;
      property PackageSpecification;
    end;

こうして生成されたユニットをアプリケーションのプロジェクトに組み込めば、以下のようにしてパッケージ関数を簡単に呼び出せるようになります。

  Dpt := TDepartMent.Create;
  try
    showmessage('There are ' + IntToStr(EmployeeCount(10) +  ' in DEPT #10.');
  finally
    Dpt.Free;
  end;

::

var DeptRow: TDeptRowtype; begin DeptRow := TDeptRowtype.Create(DataModule.MainSession); try DeptRow.Deptno := 40;
DeptRow.Dname := ‘OPERATIONS’; DeptRow.Loc := ‘BOSTON’; DataModule.Department.InsertRecord(DeptRow);
finally DeptRow.Free; end; end;

パッケージウィザードの利用手順

以下に、パッケージウィザードの利用手順を簡単にまとめます。詳細な機能については、実際に実行画面を見てどのようなオプションが選択可能かを確認し、自動生成されたユニットのソースコードを見て、その効果を確認するのが一番ではないでしょうか。また、ヘルプのPackage
Wizardのセクションにも目を通してください。

  1. Package Wizard を起動してOracleにログオンし、パッケージ名を選択
  2. 生成オブジェクトの命名方法をカスタマイズ
  3. 生成するメソッド(プロシージャ、ファンクション)を選択
  4. ソースコード生成のパラメータを設定 して、生成実行!

注意点

パッケージウィザードは、全てのパッケージを、完全に処理できるわけではありません。以下にあげるような限界があります

  • DOAが扱えるPL/SQL
    Table型には制限があります。整数、文字列、日付などの単純型の配列は扱えますが、レコード型要素からなるPL/SQLテーブル(配列)を引数・戻り値に持つプロシージャは生成できません。(PL/SQLテーブルについては後述)
  • Delphiの予約語と重なる名称がOracleのプロシージャ名、パッケージ名に使われていた場合、変換はできません
    いずれにせよ、ウィザードが生成したソースコードに一度は目を通して下さい。

以下に、実際の画面イメージを示します

まず。パッケージを選択します

次に、オブジェクト命名ルールを設定します。下記の通りのデフォルト設定でまず大丈夫でしょう

生成対象のメソッドを選択します

最後にソースの自動生成方法を設定します