3.1 PL/SQLでのオブジェクトの宣言と初期化
PL/SQLのブロック、サブプログラムまたはパッケージでオブジェクト型を使用する場合、2段階の操作を行います。
-
SQL*Plusまたはそれと同種のプログラムでは、
CREATE TYPE
SQL文を使用してオブジェクト型を定義する必要があります。オブジェクト型がスキーマに定義およびインストールされたら、その型はすべてのPL/SQLブロック、サブプログラムまたはパッケージにおいて使用できます。
-
その後、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は、CHAR
やNUMBER
などの組込み型が使用できるところであればどこでも使用できます。
-
組込み型と同じ方法でオブジェクトを宣言します。
例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を参照してください。