プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

オブジェクトの概要

Pro*C/C++では、Oracle8以降これまでサポートされていたOracleのリレーショナル・データ型に加えて、次のユーザー定義データ型がサポートされます。

オブジェクト型

オブジェクト型は、ユーザー定義によるデータ型です。これには、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

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

  • TREAT

IS OF type演算子は、特定のtype情報についてオブジェクト・インスタンスをテストするために使用します。

次のコード例では、pEmployee_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);