3.1 PL/SQLでのオブジェクトの宣言と初期化

PL/SQLのブロック、サブプログラムまたはパッケージでオブジェクト型を使用する場合、2段階の操作を行います。

  1. SQL*Plusまたはそれと同種のプログラムでは、CREATE TYPE SQL文を使用してオブジェクト型を定義する必要があります。

    オブジェクト型がスキーマに定義およびインストールされたら、その型はすべてのPL/SQLブロック、サブプログラムまたはパッケージにおいて使用できます。

  2. その後、PL/SQLで、先の手順で定義したユーザー定義型またはADTをデータ型に持つ変数を宣言します。

オブジェクトおよびADTには、通常の有効範囲とインストール・ルールが適用されます。

関連項目:

オブジェクト型について

3.1.1 オブジェクト型の定義

オブジェクト型はCREATE TYPEを使用して定義できます。

例3-1に、2つのオブジェクト型と、オブジェクト型の1つの表を示します。続く各例に、PL/SQLでこれらのオブジェクト型の変数を宣言し、これらのオブジェクトが関連するその他の操作を実行する方法を示します。

例3-1 オブジェクト型を使用した作業

CREATE TYPE address_typ AS OBJECT ( 
   street          VARCHAR2(30),
   city            VARCHAR2(20),
   state           CHAR(2),
   postal_code     VARCHAR2(6) );
/
CREATE TYPE employee_typ AS OBJECT (
  employee_id       NUMBER(6),
  first_name        VARCHAR2(20),
  last_name         VARCHAR2(25),
  email             VARCHAR2(25),
  phone_number      VARCHAR2(20),
  hire_date         DATE,
  job_id            VARCHAR2(10),
  salary            NUMBER(8,2),
  commission_pct    NUMBER(2,2),
  manager_id        NUMBER(6),
  department_id     NUMBER(4),
  address           address_typ,
  MAP MEMBER FUNCTION get_idno RETURN NUMBER,
  MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) );
/
CREATE TYPE BODY employee_typ AS
  MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
  BEGIN
    RETURN employee_id;
  END;
  MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(first_name || ' '  || last_name);
    DBMS_OUTPUT.PUT_LINE(address.street);
    DBMS_OUTPUT.PUT_LINE(address.city || ', '  || address.state || ' ' ||
                         address.postal_code);   
  END;
END;
/
CREATE TABLE employee_tab OF employee_typ;

3.1.2 PL/SQLブロックでのオブジェクトの宣言

オブジェクトとADTは、CHARNUMBERなどの組込み型が使用できるところであればどこでも使用できます。

  • 組込み型と同じ方法でオブジェクトを宣言します。

例3-2では、employee_typ型のempオブジェクトを宣言しています。次に、オブジェクト型employee_typのコンストラクタによりオブジェクトが初期化されています。

例3-2 PL/SQLブロックでのオブジェクトの宣言

-- Requires Ex. 3-1
DECLARE
  emp employee_typ; -- emp is atomically null
BEGIN
-- call the constructor for employee_typ
  emp := employee_typ(315, 'Francis', 'Logan', 'FLOGAN',
        '415.555.0100', '01-MAY-04', 'SA_MAN', 11000, .15, 101, 110, 
         address_typ('376 Mission', 'San Francisco', 'CA', '94222'));
  DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name); -- display details
  emp.display_address();  -- call object method to display details
END;
/

PL/SQLサブプログラムの仮パラメータは、ユーザー定義型のデータ型を持つことができます。したがって、ストアド・サブプログラムにオブジェクトを渡したり、あるサブプログラムから別のサブプログラムへとオブジェクトを渡したりすることができます。

次のコード行では、オブジェクト型employee_typが仮パラメータのデータ型を指定しています。

PROCEDURE open_acct (new_acct IN OUT employee_typ) IS ...

このコード行では、オブジェクト型employee_typがファンクションの戻り型を指定しています。

FUNCTION get_acct (acct_id IN NUMBER) RETURN employee_typ IS ...

3.1.3 PL/SQLでの未初期化オブジェクトの処理規則

ユーザー定義型は、コレクションと同様、オブジェクト型のコンストラクタをコールしてオブジェクトを初期化するまではアトミックNULLです。つまり、オブジェクトの属性のみではなく、オブジェクト自体がNULLになります。

NULLオブジェクトを他の任意のオブジェクトと比較すると、結果は常にNULLになります。また、アトミックNULLのオブジェクトを別のオブジェクトに代入した場合は、そのオブジェクトもアトミックNULLになります(再初期化する必要があります)。同様に、値のないNULLをオブジェクトに代入した場合も、オブジェクトはアトミックNULLになります。

式の中では、未初期化オブジェクトの属性はNULLとして評価されます。IS NULL比較演算子は、未初期化オブジェクトまたはその属性に適用された場合、TRUEを返します。

NULLオブジェクト、およびNULLを持つオブジェクトについては、例2-1を参照してください。