3.1 PL/SQLでのオブジェクトの宣言と初期化
PL/SQLのブロック、サブプログラムまたはパッケージでオブジェクト型を使用する場合、2ステップの操作を行います。
-
SQL*Plusまたはそれと同種のプログラムでは、
CREATE TYPESQL文を使用してオブジェクト型を定義する必要があります。オブジェクト型がスキーマに定義およびインストールされたら、その型はすべてのPL/SQLブロック、サブプログラムまたはパッケージにおいて使用できます。
-
その後、PL/SQLで、先の手順で定義したユーザー定義型またはADTをデータ型に持つ変数を宣言します。
オブジェクトおよびADTには、通常の有効範囲とインストール・ルールが適用されます。
関連項目:
親トピック: PL/SQLでのオブジェクト型の使用
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;親トピック: PL/SQLでのオブジェクトの宣言と初期化
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 ...
親トピック: PL/SQLでのオブジェクトの宣言と初期化
3.1.3 PL/SQLでの未初期化オブジェクトの処理規則
ユーザー定義型は、コレクションと同様、オブジェクト型のコンストラクタをコールしてオブジェクトを初期化するまではアトミックNULLです。つまり、オブジェクトの属性のみではなく、オブジェクト自体がNULLになります。
NULLオブジェクトを他の任意のオブジェクトと比較すると、結果は常にNULLになります。また、アトミックNULLのオブジェクトを別のオブジェクトに代入した場合は、そのオブジェクトもアトミックNULLになります(再初期化する必要があります)。同様に、値のないNULLをオブジェクトに代入した場合も、オブジェクトはアトミックNULLになります。
式の中では、未初期化オブジェクトの属性はNULLとして評価されます。IS NULL比較演算子は、未初期化オブジェクトまたはその属性に適用された場合、TRUEを返します。
NULLオブジェクト、およびNULLを持つオブジェクトについては、例2-1を参照してください。
親トピック: PL/SQLでのオブジェクトの宣言と初期化