Pro*C/C++では、Oracle8以降これまでサポートされていたOracleのリレーショナル・データ型に加えて、次のユーザー定義データ型がサポートされます。
オブジェクト型
オブジェクト型のREF
コレクション・オブジェクト・タイプ
関連項目:
型の継承
オブジェクト型は、ユーザー定義によるデータ型です。これには、CREATE TYPE SQL文で変数として定義されるデータ型の属性と、オブジェクト型に適用できる動作としての関数およびプロシージャからなるメソッドが含まれます。このマニュアルでは、属性のみを持つオブジェクト型を考えます。
次に例を示します。
--Defining an object type...
CREATE TYPE employee_type AS OBJECT(
name VARCHAR2(20),
id NUMBER,
MEMBER FUNCTION get_id(name VARCHAR2) RETURN NUMBER);
/
--
--Creating an object table...
CREATE TABLE employees OF employee_type;
--Instantiating an object, using a constructor...
INSERT INTO employees VALUES (
employee_type('JONES', 10042));
LONG、LONG RAW、NCLOB、NCHARおよびNCHAR可変幅データ型は、オブジェクト属性では使用できません。
REF(「reference」の短縮形)はオブジェクト自体の参照ではなく、データベース表に格納されているオブジェクトを参照します。REF型は、リレーショナル列に指定できるのみでなく、オブジェクト型のデータ型としても指定できます。たとえば、次のように、表employee_tabにオブジェクト型employee_t自体のREFを表す列を組み込むことができます。
CREATE TYPE employee_t AS OBJECT( empname CHAR(20), empno INTEGER, manager REF employee_t); / CREATE TABLE employee_tab OF employee_t;
Oracleでは、オブジェクトの型の継承がサポートされます。これにより、類似するオブジェクト型の間で属性とメソッドを共有したり、オブジェクト型の特性を拡張したりできます。
Pro*C/C++では、次のSQL演算子によるオブジェクト型の継承がサポートされます。
IS OF type演算子は、特定のtype情報についてオブジェクト・インスタンスをテストするために使用します。
次のコード例では、pがEmployee_tおよびStudent_t型のすべてのpオブジェクトの参照が戻されます。
SELECT REF(p) FROM person_tab p WHERE VALUE(p) IS OF (Employee_t, Student_t);
次のコード例では、Student_t型のpのみを含むすべての行が戻されます。
SELECT VALUE(p) FROM person_tab p WHERE VALUE(p) IS OF (ONLY Student_t);
TREAT演算子は、式の宣言された型を変更するために使用します。
次のコード例では、Student_t型のpを含むすべての行が戻されます。pのうち、Student_t型でないすべてのインスタンスについては、NULLが戻されます。
SELECT TREAT(VALUE(p) AS Student_t) FROM person_tab p;
次のコード例では、Student_t型のすべてのpオブジェクトとサブタイプPartTimeStudent_tのオブジェクトの参照が戻されます。
SELECT TREAT(REP(p) AS REF Student_t) FROM person_tab p WHERE VALUE(p) IS OF (Student_t);