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 コレクション問合せの結果のネスト解除
-- 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_persons
とe.dept_emps
との間の依存結合を、NULL
で拡張することを示しています。つまり、department_persons
からはe.dept_emps
がNULL
または空である行が問合せ結果に含められ、それらの行の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
式に埋め込まれているSELECT
のFROM
句に使用されている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
表から、すべてのregions
、countries
および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_country
がcountries
のネストした表型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.5 ネストした表の多重集合操作
ネストした表に対して多重集合操作を使用できます。VARRAYには多重集合操作を実行できません。
この項のSQLの例では、例5-5で作成したネストした表と、例5-1で作成したオブジェクトを使用します。
関連項目:
-
その他の操作の詳細は、「オブジェクトに便利なファンクションおよび演算子」を参照してください
-
ネストした表で演算子を使用する場合の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
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
ファンクション内で使用する必要があります。
関連項目:
-
COLLECT
ファンクションの例は、「CAST」を参照してください。 -
COLLECT
ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
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
回出現する場合、m
がn
より大きければ、結果にはこの要素が(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))
=
l
、x
は多重集合で、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言語リファレンス』を参照してください。