8.1 オブジェクトの記憶域
Oracleデータベースは、オブジェクト型の複合構造を、記憶域に対する単純な表構造に自動的にマップします。
内容は次のとおりです。
8.1.1 リーフ・レベル属性
オブジェクト型はツリー構造に似ており、ブランチが属性を表します。それ自体がオブジェクトである属性は、それ自体の属性でサブブランチを発生させます。
最終的に、各ブランチの終わりは、組込み型(NUMBER
、VARCHAR2
、REF
など)またはコレクション型(VARRAY
、ネストした表など)の属性になります。元のオブジェクト型のこのようなリーフ・レベル属性は、それぞれ表の列に格納されます。
コレクション型ではないリーフ・レベル属性は、オブジェクト型のリーフ・レベル・スカラー属性と呼ばれます。
次の内容は、「オブジェクトを表に格納する方法」のオブジェクト表およびリレーショナル表の説明に関連しています。
8.1.2 列にまたがって分割される行オブジェクト
オブジェクト表では、すべてのリーフ・レベル・スカラー属性またはREF
属性に対するデータが、個々の列に格納されます。
注意:
各VARRAY
も、大きすぎないかぎり、列に格納されます。ネストした表型のリーフ・レベル属性は、オブジェクト表に対応付けられた個々の表に格納されます。これらの表は、オブジェクト表宣言の一部として宣言する必要があります。
オブジェクト表にある行オブジェクトの属性を取り出したり、変更する場合、対応する操作が表の列で実行されます。行オブジェクト自体の値にアクセスすると、オブジェクト表の列を引数として使用し、その型のデフォルトのコンストラクタを起動して、オブジェクトのコピーを生成します。
システムによって生成されたオブジェクト識別子は、非表示列に格納されます。オブジェクト識別子を使用して、そのオブジェクトに対するREF
を作成します。
関連項目:
8.1.3 列オブジェクトを持つ表の非表示列
表(リレーショナル表)がオブジェクト型の列とともに定義されている場合、オブジェクト型のリーフ・レベル属性に対する表に、非表示列が追加されます。
オブジェクト型の各列には、その列オブジェクトのNULL情報(トップレベルのオブジェクトおよびネストしたオブジェクトのアトミックNULL)を格納するための非表示列があります。
8.1.4 代入可能な列およびオブジェクト表の非表示列
代入可能な列またはオブジェクト表には、その列のオブジェクト型の各属性に対してのみでなく、そのオブジェクト型のサブタイプに追加された各属性に対しても、非表示列があります。
非表示列には、代入可能な列に挿入されたサブタイプのインスタンスに対する属性の値が格納されます。
型判別式の列およびNULLイメージ列以外に、次の列が例8-1で作成されるperson_typ
の代入可能な列に関連付けられます。
-
person_typ
の各属性の非表示列:idno
、name
およびphone
-
person_typ
のサブタイプの属性の非表示列
したがって、student_typ
に対する属性dept_id
とmajor
およびpart_time_student_typ
に対する属性number_hours
がperson_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));
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_TYPES
、DBA_TYPES
およびALL_TYPES
には、各型に対する型ID値を与えるTYPEID
列(非表示ではない)があります。この列に対して結合を実行して、型判別式の列にある型IDに対応する型名を取得できます。
関連項目:
SYS_TYPEID
、型IDおよび型判別式の列の詳細は、「SYS_TYPEID」を参照してください。
8.1.6 REFの記憶域
データベースによって行オブジェクトに対するREF
が作成されるとき、作成されるREF
は、オブジェクト識別子(OID)、オブジェクト表のいくつかのメタデータ、ROWID
(オプション)で構成されます。
REF
型の列にあるREF
のサイズは、次のように、その列に対応付けられた記憶域要件によって決まります。
-
列が
REF
WITH
ROWID
として宣言されている場合、ROWID
はREF
列に格納されます。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の記憶域上の考慮点」を参照してください。