コレクション・オブジェクト・タイプには、NESTED TABLEおよびVARRAYの2種類があります。
コレクション型は、リレーショナル列に指定できるのみでなく、オブジェクト型の属性としても指定できます。すべてのコレクションは、データベース内では必ず名前付きのオブジェクト型である必要があります。VARRAYの場合は、最初にデータベース内に名前付きの型を作成して、希望する配列の要素型と最大配列サイズを指定する必要があります。
Oracleでは、ネスト・レベルを単一にするという制限がなくなっています。Oracleではオブジェクトの複数レベルのコレクションがサポートされるため、NESTED TABLEとVARRAYを複数レベルで使用できます。
NESTED TABLEは、列内での要素と呼ばれる行の集まり(コレクション)です。データベース表の各行には、そのような要素が多数あります。簡単な例として、各従業員の作業リストがあります。この場合、多対1リレーションシップを1つの表に格納でき、従業員と作業の表を結合する必要はありません。
NESTED TABLEは、次の点でC言語の配列およびC++配列と異なります。
配列には一定の上限がありますが、NESTED TABLEには制限がありません(インデックス最大値がありません)。
配列には連続する添字があり、稠密です。NESTED TABLEは稠密または疎密です。NESTED TABLEがプログラムの配列に取り出されると、間隔はスキップされ、間隔のない稠密な配列が作成されます。
CREATE TYPE文を使用して表タイプを定義します。表タイプは、リレーショナル表の1つ以上の列でその他のオブジェクト型の中にネストできます。
たとえば、組織の各部門に複数のプロジェクトを格納する場合を考えます。
CREATE TYPE project_type AS OBJECT ( pno CHAR(5), pname CHAR(20), budget NUMBER(7,2)) ; CREATE TYPE project_table AS TABLE OF project_type ; CREATE TABLE depts ( dno CHAR(5), dname CHAR(20), budgets_limit NUMBER(15,2), projects project_table) NESTED TABLE projects STORE AS depts_projects ;
VARRAY型を作成する場合、NESTED TABLEとは異なり、要素の最大数を指定する必要があります。NESTED TABLEでは稠密または疎密にできますが、VARRAYは疎密にはできません。VARRAYおよびNESTED TABLEの要素は、両方とも0から始まります。
次のようなCREATE TYPE文で、VARRAYを作成します。
CREATE TYPE employee AS OBJECT ( name VARCHAR2(10), salary NUMBER(8,2) ) ; CREATE TYPE employees AS VARRAY(15) OF employee ; CREATE TYPE department AS OBJECT ( name VARCHAR2(15), team employees ) ;
VARRAYは、リレーショナル表の列またはオブジェクト型の属性として使用します。この場合、各チームについて最大15レコード(チームの名前を含みます)で構成されるリレーショナル表と比較して、記憶域を節約できます。
C言語またはC++プログラムでは、NESTED TABLEはコレクションのインデックス値0から読込みが開始されます。配列にNESTED TABLEを書き込むと、NESTED TABLEの要素は配列インデックス0で格納されます。配列に格納されたNESTED TABLEが疎密(インデックスに間隔があります)の場合、間隔はスキップされます。配列がNESTED TABLEに読み込まれると、間隔が再作成されます。
C言語またはC++プログラムでは、VARRAYは配列に書き込まれます(インデックス0から開始します)。VARRAYに再び読み込まれると、要素はインデックス0から同じ順序でリストアされます。このため、配列を使用するとコレクションに簡単にアクセスできます。