8.1 オブジェクトの記憶域

Oracleデータベースは、オブジェクト型の複合構造を、記憶域に対する単純な表構造に自動的にマップします。

内容は次のとおりです。

8.1.1 リーフ・レベル属性

オブジェクト型はツリー構造に似ており、ブランチが属性を表します。それ自体がオブジェクトである属性は、それ自体の属性でサブブランチを発生させます。

最終的に、各ブランチの終わりは、組込み型(NUMBERVARCHAR2REFなど)またはコレクション型(VARRAY、ネストした表など)の属性になります。元のオブジェクト型のこのようなリーフ・レベル属性は、それぞれ表の列に格納されます。

コレクション型ではないリーフ・レベル属性は、オブジェクト型のリーフ・レベル・スカラー属性と呼ばれます。

次の内容は、「オブジェクトを表に格納する方法」のオブジェクト表およびリレーショナル表の説明に関連しています。

8.1.2 列にまたがって分割される行オブジェクト

オブジェクト表では、すべてのリーフ・レベル・スカラー属性またはREF属性に対するデータが、個々の列に格納されます。

注意:

VARRAYも、大きすぎないかぎり、列に格納されます。ネストした表型のリーフ・レベル属性は、オブジェクト表に対応付けられた個々の表に格納されます。これらの表は、オブジェクト表宣言の一部として宣言する必要があります。

オブジェクト表にある行オブジェクトの属性を取り出したり、変更する場合、対応する操作が表の列で実行されます。行オブジェクト自体の値にアクセスすると、オブジェクト表の列を引数として使用し、その型のデフォルトのコンストラクタを起動して、オブジェクトのコピーを生成します。

システムによって生成されたオブジェクト識別子は、非表示列に格納されます。オブジェクト識別子を使用して、そのオブジェクトに対するREFを作成します。

8.1.3 列オブジェクトを持つ表の非表示列

表(リレーショナル表)がオブジェクト型の列とともに定義されている場合、オブジェクト型のリーフ・レベル属性に対する表に、非表示列が追加されます。

オブジェクト型の各列には、その列オブジェクトのNULL情報(トップレベルのオブジェクトおよびネストしたオブジェクトのアトミックNULL)を格納するための非表示列があります。

8.1.4 代入可能な列およびオブジェクト表の非表示列

代入可能な列またはオブジェクト表には、その列のオブジェクト型の各属性に対してのみでなく、そのオブジェクト型のサブタイプに追加された各属性に対しても、非表示列があります。

非表示列には、代入可能な列に挿入されたサブタイプのインスタンスに対する属性の値が格納されます。

型判別式の列およびNULLイメージ列以外に、次の列が例8-1で作成されるperson_typの代入可能な列に関連付けられます。

  • person_typの各属性の非表示列: idnonameおよびphone

  • person_typのサブタイプの属性の非表示列

したがって、student_typに対する属性dept_idmajorおよびpart_time_student_typに対する属性number_hoursperson_typの代入可能な列に関連付けられる場合があります。

サブタイプを作成する場合、サブタイプの新しい属性の非表示列が、その新しいサブタイプの祖先クラスの代入可能な列を含む表に自動的に追加されます。追加された非表示列は、表にレトロフィットして、新しい型のデータを格納できるようになります。なんらかの理由で、非表示列を追加できない場合は、そのサブタイプの作成はロールバックされます。

VALIDATEオプションとともにDROP TYPEを使用してサブタイプを削除すると、データを含まないサブタイプの固有の属性に対する非表示列は、自動的に削除されます。これらの列にデータが含まれる場合、エラーが発生します。

例8-1では、関連する例に必要な型を作成します。

例8-1 型の作成および表への挿入

-- drop any of these objects created for Ex.7-10
CREATE TYPE person_typ AS OBJECT (
  idno           NUMBER,
  name           VARCHAR2(30),
  phone          VARCHAR2(20),
  MAP MEMBER FUNCTION get_idno RETURN NUMBER )
  NOT FINAL;
/
CREATE TYPE BODY person_typ AS
  MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
  BEGIN
    RETURN idno;
  END;
END;
/
CREATE TYPE student_typ UNDER person_typ (
    dept_id NUMBER,
    major VARCHAR2(30))
NOT FINAL;
/
CREATE TYPE part_time_student_typ UNDER student_typ (
  number_hours NUMBER);
/
CREATE TYPE employee_typ UNDER person_typ (
    emp_id NUMBER, 
    mgr VARCHAR2(30));
/
CREATE TABLE person_obj_table OF person_typ;  // an object table
INSERT INTO person_obj_table 
  VALUES (person_typ(12, 'Bob Jones', '650-555-0130'));
INSERT INTO person_obj_table 
  VALUES (student_typ(51, 'Joe Lane', '1-650-555-0140', 12, 'HISTORY'));
INSERT INTO person_obj_table 
  VALUES (part_time_student_typ(52, 'Kim Patel', '1-650-555-0135', 14,
          'PHYSICS', 20));

代入可能な列は、非表示の型判別式の列に関連付けられます。非表示列には、型IDと呼ばれる識別子があり、この識別子によって、代入可能な列中の各オブジェクトのうち、最も具体的な型が識別されます。通常、型ID(RAW)は1バイトですが、大きな階層の場合は最大4バイトまでとなります。

指定されたオブジェクト・インスタンスの型IDは、ファンクションSYS_TYPEIDを使用して特定できます。

例8-2では、例8-1で作成した代入可能なオブジェクト表に格納されるオブジェクト・インスタンスの型IDを取り出します。

8.1.5 表に格納されるオブジェクトの型IDの問合せ

代入可能なオブジェクト表に格納されるオブジェクト・インスタンスの型IDを取り出すことができます。例8-2を参照してください。

例8-2 表に格納されるオブジェクトの型IDの問合せ

-- Requires Ex. 8-1
SELECT name, SYS_TYPEID(VALUE(p)) typeid 
  FROM person_obj_table p;

出力:

NAME                           TYPEID
------------------------------ ---------------------------
Bob Jones                      01
Joe Lane                       02
Kim Patel                      03

カタログ・ビューのUSER_TYPESDBA_TYPESおよびALL_TYPESには、各型に対する型ID値を与えるTYPEID列(非表示ではない)があります。この列に対して結合を実行して、型判別式の列にある型IDに対応する型名を取得できます。

関連項目:

SYS_TYPEID、型IDおよび型判別式の列の詳細は、「SYS_TYPEID」を参照してください。

8.1.6 REFの記憶域

データベースによって行オブジェクトに対するREFが作成されるとき、作成されるREFは、オブジェクト識別子(OID)、オブジェクト表のいくつかのメタデータ、ROWID (オプション)で構成されます。

REF型の列にあるREFのサイズは、次のように、その列に対応付けられた記憶域要件によって決まります。

  • 列がREF WITH ROWIDとして宣言されている場合、ROWIDREF列に格納されます。ROWIDのヒントは、制約付きREF列にあるオブジェクト参照では無視されます。

  • 列がSCOPE句を使用してREFとして宣言されている場合、オブジェクト表のメタデータおよびROWIDの省略によって、その列は少なくなります。有効範囲付きREFの長さは、16バイトです。

8.1.7 ネストした表の内部レイアウト

ネストした表の行は、別の記憶表に格納されます。ネストした表の各列には、1つの記憶表が対応付けられています。記憶表は、その列にあるすべてのネストした表に対するすべての要素を保持しています。記憶表にはシステム生成の値を持つ非表示のNESTED_TABLE_ID列があり、これによって、Oracleデータベースでは、ネストした表の要素が適切な行にマップできます。

記憶表を索引構成表にすることによって、コレクション全体を取り出す問合せを高速化できます。ORGANIZATION INDEX句をSTORE AS句の中に挿入します。

ネストした表型は、オブジェクトまたはスカラーを含むことができます。

  • 要素がオブジェクトである場合、記憶表はオブジェクト表のようになります。つまり、そのオブジェクト型のトップレベルの属性が記憶表の列となります。ただし、ネストした表の行にはオブジェクト識別子の列がないため、ネストした表のオブジェクトに対するREFの作成はできません。

  • 要素がスカラーである場合、記憶表には、スカラー値を含むCOLUMN_VALUEという単一の列が含まれます。

関連項目:

「ネストした表の記憶域」を参照してください。

8.1.8 VARRAYの内部レイアウト

VARRAYのすべての要素は、単一の列に格納されます。配列のサイズに基づいて、インラインまたはBLOBに格納されます。

関連項目:

詳細は、「VARRAYの記憶域上の考慮点」を参照してください。