5.3 コレクション・データ型の操作

コレクション・データ型に対する操作には、問合せと比較があります。

内容は次のとおりです。

5.3.1 コレクションの問合せ

列または属性としてコレクション型が含まれる表を問い合せるには、次の2つの一般的な方法があります。

  • コレクションが含まれる結果行の中にコレクションをネストします。

  • それぞれのコレクション要素が単独で1行に現れるように、コレクションを分散またはネスト解除します。

内容は次のとおりです。

5.3.1.1 コレクション問合せの結果のネスト化

SELECT構文のリスト内のコレクション列を問い合せると、コレクションと関連付けられた結果行の中のコレクションの要素がネストされます。

例5-16の問合せでは、例5-3に示したdepartment_persons表を使用します。

dept_empsは、person_typ型のネストした表コレクションです。dept_empsコレクション列は、通常のスカラー列としてSELECT構文のリストに現れます

例5-16 コレクション問合せの結果のネスト化

-- Requires Ex. 5-1 and Ex. 5-3
SELECT d.dept_emps 
  FROM department_persons d;

前述の問合せでは、次の従業員のネストしたコレクションが取り出されます。

DEPT_EMPS(IDNO, NAME, PHONE)
-------------------------------------------------------------
PEOPLE_TYP(PERSON_TYP(1, 'John Smith', '1-650-555-0135'),
PERSON_TYP(2, 'Diane Smith', '1-650-555-0135'))

また、SELECT構文のリスト内のオブジェクト型列にコレクション属性が入っている場合、SELECT構文のリストにこのコレクションが明示的にリストされていなくても、結果はネストされます。たとえば、SELECT * FROM department_personsという問合せを行うと、ネストされた結果が作成されます。

5.3.1.2 コレクション問合せの結果のネスト解除

コレクション問合せの結果をネスト解除できます。

すべてのツールやアプリケーションが、ネストされた形式の結果を処理できるとはかぎらないため、コレクション問合せ結果のネスト解除は便利です。従来のフォーマットを必要とするツールを使用してOracleコレクション・データを参照するには、1つの行のコレクション属性をネスト解除またはフラット化して1つ以上のリレーショナル行にする必要があります。そのためには、コレクションとともにTABLE式を使用します。TABLE式を使用すると、表と同様の方法で、FROM句でコレクションを問い合せることができます。つまり、ネストした表が入っている行とネストした表を結合する操作をします。

TABLE式は、変数やパラメータなどの一時値を含むコレクション値式の問合せに使用できます。

関連項目:

TABLE式およびコレクションのネスト解除の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例5-17の問合せでは、例5-16と同様に従業員のコレクションが取り出されますが、コレクションはネスト解除されます。

例5-17 コレクション問合せの結果のネスト解除

-- Requires Ex. 5-1 and 5-3
SELECT e.* 
  FROM department_persons d, TABLE(d.dept_emps) e;

出力:

IDNO       NAME                           PHONE
---------- ------------------------------ ---------------
1          John Smith                     1-650-555-0135
2          Diane Smith                    1-650-555-0135

例5-17では、TABLE式がそれ自身の表別名を持つことができることがわかります。TABLE式の表別名は、TABLE式によって戻される列を選択するために、SELECT構文のリストの中にあります。

TABLE式は、別の表別名を使用して、TABLE式が参照するコレクション列が含まれている表を指定します。TABLE(d.dept_emps)式は、dept_empsコレクション列が含まれている表としてdepartment_persons表を指定します。表列を参照するには、TABLE式でFROM句の式の左側にある表の表別名を使用できます。これを左相関といいます。

例5-17の例では、使用するTABLE式の表別名を指定するために、FROM句にdepartment_persons表がリストされています。結果として生成されるdepartment_persons表の列は、TABLE式によって参照される列にかぎられます。

次の例は、従業員のいる部門の行のみを取り出します。

SELECT d.dept_no, e.* 
  FROM department_persons d, TABLE(d.dept_emps) e;

従業員のいない部門の行も取り出すには、外部結合構文を使用します。

SELECT d.dept_no, e.* 
  FROM department_persons d, TABLE(d.dept_emps) (+) e;

(+)は、department_personse.dept_empsとの間の依存結合を、NULLで拡張することを示しています。つまり、department_personsからはe.dept_empsNULLまたは空である行が問合せ結果に含められ、それらの行のe.dept_empsに対応する列にNULL値が設定されます。

5.3.1.3 TABLE式の副問合せが含まれている問合せのネスト解除

TABLE式に、コレクションの副問合せを含めることができます。

これは、コレクションの名前が入っているTABLE式を示す「コレクション問合せの結果のネスト解除」の例にかわる方法です。

例5-18では、部門番号が101である従業員のコレクションが戻されます。

例5-18 コレクションの副問合せが含まれているTABLE式の使用

-- Requires Ex. 5-1 and 5-3
SELECT *
  FROM TABLE(SELECT d.dept_emps 
               FROM department_persons d
               WHERE d.dept_no = 101);

TABLE式の中の副問合せには、次の制限があります。

  • 副問合せでは、コレクション型を戻す必要があります。

  • 副問合せのSELECT構文のリストには、1つの項目を入れる必要があります。

  • 副問合せでは、1つのコレクションのみを戻す必要があります。複数行についてのコレクションを戻すことはできません。たとえば、副問合せSELECT dept_emps FROM department_personsは、department_persons表に1行のみ入っている場合にかぎり、TABLE式で成功します。表に複数行が含まれている場合、副問合せはエラーを戻します。

5.3.1.4 CURSOR式でのTABLE式の使用

CURSOR式内でTABLE式を使用できます。

例5-19に、CURSOR式に埋め込まれているSELECTFROM句に使用されているTABLE式を示します。

例5-19 CURSOR式でのTABLE式の使用

-- Requires Ex. 5-1 and 5-3
SELECT d.dept_no, CURSOR(SELECT * FROM TABLE(d.dept_emps)) 
  FROM department_persons d
   WHERE d.dept_no = 101;

5.3.1.5 マルチレベル・コレクションを伴う問合せのネスト解除

問合せのネスト解除は、VARRAYとネストした表のどちらについても、マルチレベル・コレクションでも使用できます。

例5-20は、ネストした表のマルチレベルのネストした表コレクションに対して行う問合せのネスト解除を示しています。この問合せでは、それぞれの地域がcountriesのネストした表を持ち、それぞれの国がlocationsのネストした表を持つregion_tab表から、すべてのregionscountriesおよびlocationsの名前が戻されます。

例5-20 TABLEファンクションによるマルチレベル・コレクションを伴う問合せのネスト解除

-- Requires Ex. 5-10 and 5-15
SELECT r.region_name, c.country_name, l.location_id 
  FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l;
 
-- the following query is optimized to run against the locations table
SELECT l.location_id, l.city 
  FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l;

出力は次のようになります。

REGION_NAME               COUNTRY_NAME                             LOCATION_ID
------------------------- ---------------------------------------- -----------
Europe                    Italy                                           1000
Europe                    Italy                                           1100
Europe                    Switzerland                                     2900
Europe                    Switzerland                                     3000
Europe                    United Kingdom                                  2400
Europe                    United Kingdom                                  2500
Europe                    United Kingdom                                  2600
 
7 rows selected.
LOCATION_ID CITY
----------- ------------------------------
       1000 Roma
       1100 Venice
       2900 Geneva
       3000 Bern
       2400 London
       2500 Oxford
       2600 Stretford
 
7 rows selected.

実表region_tabの列は第2のSELECT構文のリストには表示されないため、問合せは、直接locations記憶表に対して実行されるように最適化されます。

マルチレベル・コレクションの問合せでは、外部結合構文も使用できます。

5.3.2 コレクションを対象としたDML操作

Oracleでは、コレクションを対象とした次のDML操作がサポートされます。

  • コレクション全体に対して新しい値を提供する挿入および更新

  • ネストした表およびマルチレベルのネストした表に対する個別的またはピース単位の更新(要素の挿入、削除および更新を含む)

VARRAY列を対象としたピース単位の更新はサポートされません。ただし、VARRAY列を基本単位として挿入または更新することはできます。この項の内容は次のとおりです。

5.3.2.1 ネストした表を対象にしたピース単位操作の実行

ネストした表列に対してピース単位の操作を実行する場合、TABLE式を使用します。

TABLE式では、副問合せを使用してネストした表を抽出できます。これによりINSERT文、UPDATE文またはDELETE文を最上位表でなくネストした表に適用できます。

また、CAST演算子も有用です。これらを使用すると、ネストした表を実際にデータベースに格納することなく、ネストした表に対する設定操作をSQL表記法により実行できます。

例5-21のDML文は、ネストした表列を対象としたピース単位操作を示しています。

例5-21 コレクションを対象としたピース単位操作

-- Requires Ex. 5-1 and 5-3
INSERT INTO TABLE(SELECT d.dept_emps 
                  FROM department_persons d
                  WHERE d.dept_no = 101)
   VALUES (5, 'Kevin Taylor', '1-408-555-0199');

UPDATE TABLE(SELECT d.dept_emps 
                  FROM department_persons d
                  WHERE d.dept_no = 101) e   
   SET VALUE(e) = person_typ(5, 'Kevin Taylor', '1-408-555-0199')
   WHERE e.idno = 5;
     
DELETE FROM TABLE(SELECT d.dept_emps 
                  FROM department_persons d
                  WHERE d.dept_no = 101) e
   WHERE e.idno = 5;
5.3.2.1.1 ネストした表の更新

VALUEを使用して更新の目的でオブジェクト・インスタンス行を戻すことができます。

例5-22は、更新の目的でオブジェクト・インスタンス行を戻すためにVALUEを使用しています。

例5-22 VALUEによるネストした表の更新

-- Requires Ex. 5-1, 5-3
UPDATE TABLE(SELECT d.dept_emps FROM department_persons d 
               WHERE  d.dept_no = 101) p
   SET VALUE(p) = person_typ(2, 'Diane Smith', '1-650-555-0148')
   WHERE p.idno = 2;

5.3.2.2 マルチレベルのネストした表を対象にしたピース単位操作の実行

ピース単位のDMLは、マルチレベルのネストした表に対してのみ実行でき、マルチレベルのVARRAYに対しては実行できません。

「基本データ単位としてのコレクションの更新」で説明するように、DML操作は、VARRAYとネストした表のいずれのマルチレベル・コレクションに対しても基本単位として実行できます。

例5-23は、ネストした表のネストした表countriesに対して行うピース単位挿入操作を示しています。この例は、新しい国にlocation_typのネストした表を付けて挿入します。

例5-23 マルチレベル・コレクションに対するピース単位INSERT

-- Requires Ex. 5-10 and 5-15
INSERT INTO TABLE( SELECT countries FROM region_tab r WHERE r.region_id = 2) 
  VALUES ( 'CA', 'Canada', nt_location_typ( 
       location_typ(1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario')));
5.3.2.2.1 内側のネストした表に対するピース単位INSERTの実行

内側のネストした表に対するピース単位INSERTを使用して個々に追加できます。

例5-24では、ピース単位挿入操作を実行して、内側のネストした表を挿入し、国の所在地を追加します。この例も、前述の例と同様、内側のネストした表を選択して、挿入のターゲットを指定する副問合せが含まれているTABLE式を使用します。

例5-24 内側のネストした表に対するピース単位INSERT

-- Requires Ex. 5-10 and 5-15
INSERT INTO TABLE( SELECT c.locations 
  FROM TABLE( SELECT r.countries FROM region_tab r WHERE r.region_id = 2) c
  WHERE c.country_id = 'US')
  VALUES (1700, '2004 Lakeview Rd', '98199', 'Seattle', 'Washington');
 
SELECT r.region_name, c.country_name, l.location_id 
  FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l;

5.3.2.3 VARRAYおよびネストした表を対象にしたアトミック変更の実行

ネストした表およびVARRAYに対するアトミック変更を実行できます。

注意: ネストした表はピース単位での変更も可能ですが、VARRAYはピース単位で変更することはできません。

例5-25は、SQLのVARRAYオブジェクト型をPL/SQL文で操作する方法を示しています。この例では、VARRAYをPL/SQL変数とSQL表の間で転送しています。この例のようにして、コレクションを含む行を挿入したり、行を更新してコレクションを置き換えたり、コレクションをPL/SQL変数内で選択したりできます。

ただし、VARRAYの個々の要素をSQLで直接更新したり削除することはできません。表からVARRAYを選択し、PL/SQLで変更した後、新しいVARRAYが含まれるように表を更新する必要があります。この操作はネストした表でも行うことができますが、ネストした表には、ピース単位の更新および削除を行うこともできます。

例5-25 VARRAYに対するINSERT文、UPDATE文、DELETE文およびSELECT文の使用

CREATE TYPE dnames_var IS VARRAY(7) OF VARCHAR2(30);
/
CREATE TABLE depts (region VARCHAR2(25), dept_names dnames_var);
BEGIN
   INSERT INTO depts VALUES('Europe', dnames_var('Shipping','Sales','Finance'));
   INSERT INTO depts VALUES('Americas', dnames_var('Sales','Finance','Shipping'));
   INSERT INTO depts 
     VALUES('Asia', dnames_var('Finance','Payroll','Shipping','Sales'));
   COMMIT;
END;
/
DECLARE
   new_dnames dnames_var := dnames_var('Benefits', 'Advertising', 'Contracting', 
                                       'Executive', 'Marketing');
   some_dnames dnames_var;
BEGIN
   UPDATE depts SET dept_names  = new_dnames WHERE region = 'Europe';
   COMMIT;
   SELECT dept_names INTO some_dnames FROM depts WHERE region = 'Europe';
   FOR i IN some_dnames.FIRST .. some_dnames.LAST
   LOOP
      DBMS_OUTPUT.PUT_LINE('dept_names = ' || some_dnames(i));
   END LOOP;
END;
/

5.3.2.4 基本データ単位としてのコレクションの更新

マルチレベル・コレクション(VARRAYまたはネストした表にかかわらず)は、UPDATE文を使用して基本単位として更新することもできます。たとえば、v_countrycountries のネストした表型nt_country_typとして宣言された変数であるとします。

例5-26では、countriesコレクションを1つの単位としてv_countryの値に設定することで、region_tabを更新します。

INSERT文を使用してマルチレベル・コレクション全体を挿入する方法は、「マルチレベル・コレクションのコンストラクタ」を参照してください。

例5-26 UPDATEを使用したマルチレベル・コレクション全体の挿入

-- Requires Ex. 5-10 and 5-15
INSERT INTO region_tab (region_id, region_name) VALUES(2, 'Americas');

DECLARE
  v_country nt_country_typ;
BEGIN
  v_country :=  nt_country_typ( country_typ( 
   'US', 'United States of America', nt_location_typ (
   location_typ( 1500,'2011 Interiors Blvd','99236','San Francisco','California'),
   location_typ(1600,'2007 Zagora St','50090','South Brunswick','New Jersey'))));
  UPDATE region_tab r 
    SET r.countries = v_country WHERE r.region_id = 2;
END;
/
-- Invocation:
SELECT r.region_name, c.country_name, l.location_id 
  FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l
     WHERE r.region_id = 2;

5.3.3 結果セット全部を戻すためのBULK COLLECTの使用

PL/SQL句BULK COLLECTは、処理に時間のかかるDML文を使用しない方法の1つです。結果セット全部を1つの操作で戻すことができます。

例5-27では、オブジェクト型を含むマルチレベル・コレクションに対してBULK COLLECTを使用しています。

例5-27 コレクションに対するBULK COLLECTの使用

-- unrelated to other examples in this chapter
CREATE TYPE dnames_var IS VARRAY(7) OF VARCHAR2(30);
/
CREATE TABLE depts (region VARCHAR2(25), dept_names dnames_var);
BEGIN
   INSERT INTO depts VALUES('Europe', dnames_var('Shipping','Sales','Finance'));
   INSERT INTO depts VALUES('Americas', dnames_var('Sales','Finance','Shipping'));
   INSERT INTO depts 
     VALUES('Asia', dnames_var('Finance','Payroll','Shipping','Sales'));
   COMMIT;
END;
/
DECLARE
   TYPE dnames_tab IS TABLE OF dnames_var;
   v_depts dnames_tab;
BEGIN
    SELECT dept_names BULK COLLECT INTO v_depts FROM depts;
    DBMS_OUTPUT.PUT_LINE(v_depts.COUNT); -- prints 3
END;
/

5.3.4 ネストした表を比較する条件

一定の条件を使用すると、ネストした表(マルチレベルのネストした表を含む)を比較できます。VARRAYを比較するためのメカニズムはありません。

この項のSQLの例では、例5-5で作成したネストした表を使用し、例5-1で作成したオブジェクトが含まれます。

内容は次のとおりです。

5.3.4.1 等価および非等価条件の比較

等価(=)および非等価(<>)条件は、入力されたネストした表が同一であるかどうかを判断し、結果をブール値として戻します。

同一の名付けられた型およびカーディナリティを持ち、要素が等価である場合、2つのネストした表は等価です。要素が等価であるかどうかは、マップ・メソッドを必要とするオブジェクト型を除き、要素自体の等価性定義によって等価であるかどうかに依存します。ネストした表には順序がないため、等価性は要素の既存の順序で決定されます。

例5-28では、ネストした表には、関連付けられたマップ・メソッドを持つperson_typオブジェクトが含まれています。例5-1を参照してください。WHERE句の2つのネストした表は等しくないため、行は選択されません。

例5-28 ネストした表への等価比較の使用

-- Requires Ex. 5-1 and 5-5
SELECT p.name 
  FROM students, TABLE(physics_majors) p 
WHERE math_majors = physics_majors;

5.3.4.2 IN条件の比較

IN条件は、特定のネストした表が、ネストした表のリストに含まれているかどうかを確認し、結果をブール値として戻します。ネストした表がNULLのネストした表の場合、NULLが戻されます。

例5-29 ネストした表へのIN比較の使用

-- Requires Ex. 5-1 and 5-5
SELECT p.idno, p.name 
  FROM students, TABLE(physics_majors) p 
WHERE physics_majors IN (math_majors, chem_majors);

5.3.4.3 多重集合条件のサブセットの比較

SUBMULTISET [OF]条件は、特定のネストした表が、別のネストした表のサブセットであるかどうかを確認し、結果をブール値として戻します。OFキーワードはオプションで、SUBMULTISETの機能を変更しません。

この条件は、ネストした表のみに実装されます。

例5-30 ネストした表に対するSUBMULTISET OF条件のテスト

-- Requires Ex. 5-1 and 5-5
SELECT p.idno, p.name 
  FROM students, TABLE(physics_majors) p 
WHERE physics_majors SUBMULTISET OF math_majors;

5.3.4.4 ネストした表のメンバーの判別

MEMBER [OF]またはNOT MEMBER [OF]条件は、特定の要素がネストした表のメンバーであるかどうかを確認し、結果をブール値として戻します。OFキーワードはオプションで、出力に影響を与えません。

例5-31で、person_typは、ネストした表math_majorsの要素と同じ型の要素です。

例5-32では、MEMBER OF条件を使用しないアプローチを示します。サイズの大きいコレクションの場合、この方法のほうが実行効率が高くなります。

例5-31 ネストした表へのMEMBER OFの使用

-- Requires Ex. 5-1 and 5-5
SELECT graduation 
  FROM students 
WHERE person_typ(12, 'Bob Jones', '1-650-555-0130') MEMBER OF math_majors;

例5-32 ネストした表へのMEMBER OFを使用しない方法

-- Requires Ex. 5-1 and 5-5
SELECT graduation
  FROM students
WHERE person_typ(12, 'Bob Jones', '1-650-555-0130') in (select value(p) 
    from TABLE( math_majors) p);

5.3.4.5 Empty条件による判別

IS [NOT] EMPTY条件は、要素のいずれかがNULLであるかどうかに関係なく、指定されたネストした表が空であるかどうかを確認します。ネストした表がNULLの場合、結果はNULLです。結果はブール値として戻されます。

例5-33 ネストした表へのIS NOTの使用

-- Requires Ex. 5-1 and 5-5
SELECT p.idno, p.name 
  FROM students, TABLE(physics_majors) p 
WHERE physics_majors IS NOT EMPTY;

5.3.4.6 Set条件による判別

IS [NOT] A SET条件は、指定されたネストした表が一意の要素で構成されているかどうかを確認し、結果をブール値として戻します。

例5-34 ネストした表へのIS A SETの使用

-- Requires Ex. 5-1 and 5-5
SELECT p.idno, p.name 
  FROM students, TABLE(physics_majors) p 
WHERE physics_majors IS A SET;

5.3.5 ネストした表の多重集合操作

ネストした表に対して多重集合操作を使用できます。VARRAYには多重集合操作を実行できません。

この項のSQLの例では、例5-5で作成したネストした表と、例5-1で作成したオブジェクトを使用します。

関連項目:

5.3.5.1 CARDINALITY

CARDINALITYファンクションは、ネストした表に含まれている要素の数を戻します。戻り型は、NUMBERです。ネストした表がNULLコレクションの場合、NULLが戻されます。

例5-35 ネストした表のCARDINALITYの判別

-- Requires Ex. 5-1 and 5-5
SELECT CARDINALITY(math_majors) 
  FROM students;

CARDINALITYファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.2 COLLECT

COLLECTファンクションは集計関数で、要素のセットから多重集合を作成します。入力として要素型の列を取り、選択された行から多重集合を作成します。このファンクションの結果を取得するには、COLLECTの出力型を指定するために、CASTファンクション内で使用する必要があります。

関連項目:

5.3.5.3 MULTISET EXCEPT

MULTISET EXCEPT演算子は、2つのネストした表を入力として取り、最初のネストした表にのみ含まれ、2番目のネストした表には含まれていない要素のネストした表を戻します。入力のネストした表と出力のネストした表は、すべて同じネストした表の型です。

この演算子とともに、ALLまたはDISTINCTオプションを使用できます。デフォルトはALLです。

  • ALLオプションを使用すると、ntab1 MULTISET EXCEPT ALL ntab2の場合、ntab2に含まれている要素を除くntab1のすべての要素が、結果に含まれます。特定の要素がntab1ではm回、ntab2ではn回出現する場合、mnより大きければ、結果にはこの要素が(m - n)回出現し、そうでない場合、この要素は0回出現します。

  • DISTINCTオプションを使用すると、ntab1に存在し、ntab2にも存在する要素は、出現回数に関係なく削除されます。

例5-36 ネストした表に対するMULTISET EXCEPT操作の使用

-- Requires Ex. 5-1 and 5-5
SELECT math_majors MULTISET EXCEPT physics_majors 
  FROM students 
WHERE graduation = '01-JUN-03';

関連項目:

MULTISET EXCEPT演算子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.4 MULTISET INTERSECT

MULTISET INTERSECT演算子は、入力された2つのネストした表に共通する値で構成されるネストした表を戻します。入力のネストした表と出力のネストした表は、すべて、型の名前が等価です。

この演算子には、ALLまたはDISTINCTオプションが関連付けられています。デフォルトはALLです。ALLオプションを使用すると、特定の値が、ntab1ではm回、ntab2ではn回出現する場合、結果にはこの要素がMIN(m, n)回出現します。DISTINCTオプションの場合、結果から重複する要素は削除されます(NULL値が重複する場合はこれも含まれます)。

例5-37 ネストした表に対するMULTISET INTERSECT操作の使用

-- Requires Ex. 5-1 and 5-5
SELECT math_majors MULTISET INTERSECT physics_majors 
  FROM students 
WHERE graduation = '01-JUN-03';

関連項目:

MULTISET INTERSECT演算子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.5 MULTISET UNION

MULTISET UNION演算子は、入力された2つのネストした表の値で構成されるネストした表を戻します。入力のネストした表と出力のネストした表は、すべて、型の名前が等価です。

この演算子には、ALLまたはDISTINCTオプションが関連付けられています。デフォルトはALLです。ALLオプションを使用すると、ntab1およびntab2に含まれるすべての要素が、NULLのすべてのコピーを含め、結果に含まれます。特定の要素がntab1ではm回、ntab2ではn回出現する場合、結果にはこの要素が(m + n)回出現します。DISTINCTオプションの場合、結果から重複する要素は削除されます(NULL値が重複する場合はこれも含まれます)。

例5-38 ネストした表に対するMULTISET UNION操作の使用

-- Requires Ex. 5-1 and 5-5
SELECT math_majors MULTISET UNION DISTINCT physics_majors 
  FROM students 
WHERE graduation = '01-JUN-03';
PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-650-555-0130'),
	PERSON_TYP(31, 'Sarah Chen', '1-415-555-0120'),
	PERSON_TYP(45, 'Chris Woods', '1-408-555-0128'))
-- Requires Ex. 5-1 and 5-5
SELECT math_majors MULTISET UNION ALL physics_majors
  FROM students 
WHERE graduation = '01-JUN-03';

出力:

PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-650-555-0130'),
	PERSON_TYP(31, 'Sarah Chen', '1-415-555-0120'),
	PERSON_TYP(45, 'Chris Woods', '1-408-555-0128'),
	PERSON_TYP(12, 'Bob Jones', '1-650-555-0130'),
	PERSON_TYP(45, 'Chris Woods', '1-408-555-0128'))	

関連項目:

MULTISET UNION演算子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.6 POWERMULTISET

POWERMULTISETファンクションは、指定された多重集合から、すべての空でないサブ多重集合を生成します。POWERMULTISETファンクションの入力には、多重集合と評価されるすべての式を使用できます。多重集合引数のカーディナリティの制限は32です。

例5-39 多重集合に対するPOWERMULTISET操作の使用

-- Requires Ex. 5-1 and 5-5
SELECT * FROM TABLE(POWERMULTISET( people_typ (
           person_typ(12, 'Bob Jones', '1-650-555-0130'), 
           person_typ(31, 'Sarah Chen', '1-415-555-0120'), 
           person_typ(45, 'Chris Woods', '1-415-555-0124'))));

関連項目:

POWERMULTISETファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.7 POWERMULTISET_BY_CARDINALITY

POWERMULTISET_BY_CARDINALITYファンクションは、指定されたカーディナリティのネストした表の空でないサブ多重集合をすべて戻します。出力は、ネストした表の行です。

POWERMULTISET_BY_CARDINALITY(x, l)TABLE(POWERMULTISET(x)) pと等価です。CARDINALITY(value(p)) = lxは多重集合で、lは指定されたカーディナリティです。

POWERMULTISET_BY_CARDINALITYの最初の入力パラメータには、ネストした表と評価されるすべての式を使用できます。長さのパラメータには正の整数を使用する必要があり、そうでない場合はエラーが戻されます。ネストした表引数のカーディナリティの制限は32です。

例5-40 POWERMULTISET_BY_CARDINALITYファンクションの使用

-- Requires Ex. 5-1 and 5-5
SELECT * FROM TABLE(POWERMULTISET_BY_CARDINALITY( people_typ (
           person_typ(12, 'Bob Jones', '1-650-555-0130'), 
           person_typ(31, 'Sarah Chen', '1-415-555-0120'), 
           person_typ(45, 'Chris Woods', '1-415-555-0124')),2));

関連項目:

POWERMULTISET_BY_CARDINALITYファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

5.3.5.8 SET

SETファンクションは、重複要素を削除することによってネストした表をセットに変換し、要素が互いに固有であるネストした表を戻します。戻されるネストした表は、入力されたネストした表と同一の名付けられた型です。

例5-41 ネストした表に対するSETファンクションの使用

-- Requires Ex. 5-1 and 5-5
SELECT SET(physics_majors) 
  FROM students 
WHERE graduation = '01-JUN-03';

関連項目:

SETファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。