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);