コレクション変数への値の代入
コレクション変数には次の方法で値を代入できます。
-
コンストラクタを起動してコレクションを作成し、それをコレクション変数に代入します。
-
代入文を使用して、別の既存のコレクション変数の値を代入します。
-
OUT
パラメータまたはIN
OUT
パラメータとしてサブプログラムに渡し、サブプログラム内で値を代入する方法。 -
修飾式を使用して、連想配列に値を代入します(例6-11を参照)。
コレクション変数のスカラー要素に値を代入するには、collection_variable_name
(
index
)
として要素を参照し、値を代入します。
ここでのトピック
関連項目:
-
「代入文」の構文図
-
コレクション変数のスカラー要素に値を代入する方法については、「変数への値の代入」を参照してください
データ型の互換性
あるコレクションをコレクション変数に代入できるのは、両者のデータ型が同じ場合のみです。要素型が同じであることのみでは不十分です。
例6-14 コレクション代入のデータ型の互換性
この例では、VARRAY
型のtriplet
とtrio
が同じ要素型VARCHAR(15)
になっています。コレクション変数group1
とgroup2
のデータ型は同じtriplet
ですが、コレクション変数group3
のデータ型はtrio
です。group1
からgroup2
への代入は正常に行われますが、group1
からgroup3
への代入は失敗します。
Live SQL:
この例は、Oracle Live SQLの「コレクション代入のデータ型の互換性」で表示および実行できます
DECLARE TYPE triplet IS VARRAY(3) OF VARCHAR2(15); TYPE trio IS VARRAY(3) OF VARCHAR2(15); group1 triplet := triplet('Jones', 'Wong', 'Marceau'); group2 triplet; group3 trio; BEGIN group2 := group1; -- succeeds group3 := group1; -- fails END; /
結果:
ORA-06550: line 10, column 13: PLS-00382: expression is of wrong type
VARRAYまたはネストした表の変数へのNULL値の代入
VARRAYまたはネストした表の変数には、値NULLまたは同じデータ型のNULLのコレクションを代入できます。いずれの代入でも、変数はNULLになります。
例6-15では、ネストした表の変数dept_names
をNULL以外の値に初期化します。次に、NULLのコレクションを代入して変数をNULLにした後、別のNULL以外の値に再初期化します。
例6-15 ネストした表の変数へのNULL値の代入
Live SQL:
この例は、Oracle Live SQLの「ネストした表の変数へのNULL値の代入」で表示および実行できます
DECLARE
TYPE dnames_tab IS TABLE OF VARCHAR2(30);
dept_names dnames_tab := dnames_tab(
'Shipping','Sales','Finance','Payroll'); -- Initialized to non-null value
empty_set dnames_tab; -- Not initialized, therefore null
PROCEDURE print_dept_names_status IS
BEGIN
IF dept_names IS NULL THEN
DBMS_OUTPUT.PUT_LINE('dept_names is null.');
ELSE
DBMS_OUTPUT.PUT_LINE('dept_names is not null.');
END IF;
END print_dept_names_status;
BEGIN
print_dept_names_status;
dept_names := empty_set; -- Assign null collection to dept_names.
print_dept_names_status;
dept_names := dnames_tab (
'Shipping','Sales','Finance','Payroll'); -- Re-initialize dept_names
print_dept_names_status;
END;
/
結果:
dept_names is not null.
dept_names is null.
dept_names is not null.
ネストした表の変数へのSET演算結果の代入
ネストした表の変数には、SQL MULTISET
演算またはSQL SET
ファンクションの起動結果を代入できます。
SQLのMULTISET
演算子は、2つのネストした表を1つのネストした表に統合します。2つのネストした表の要素は、同等のデータ型を持っている必要があります。MULTISET
演算子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
SQL SET
ファンクションはネストした表を引数に取り、別個の要素を含む同じデータ型のネストした表を戻します(重複する要素は結果から削除されます)。SET
ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例6-16 ネストした表の変数へのSET演算結果の代入
この例では、複数のMULTISET
演算と1つのSET
ファンクションの起動結果をネストした表の変数answer
に代入し、代入するたびにプロシージャprint_nested_table
を使用してanswer
を出力します。このプロシージャでは、コレクション・メソッドFIRST
およびLAST
を使用しています。詳細は「コレクション・メソッド」を参照してください。
Live SQL:
この例は、Oracle Live SQLの「ネストした表の変数へのSET演算結果の代入」で表示および実行できます
DECLARE TYPE nested_typ IS TABLE OF NUMBER; nt1 nested_typ := nested_typ(1,2,3); nt2 nested_typ := nested_typ(3,2,1); nt3 nested_typ := nested_typ(2,3,1,3); nt4 nested_typ := nested_typ(1,2,4); answer nested_typ; PROCEDURE print_nested_table (nt nested_typ) IS output VARCHAR2(128); BEGIN IF nt IS NULL THEN DBMS_OUTPUT.PUT_LINE('Result: null set'); ELSIF nt.COUNT = 0 THEN DBMS_OUTPUT.PUT_LINE('Result: empty set'); ELSE FOR i IN nt.FIRST .. nt.LAST LOOP -- For first to last element output := output || nt(i) || ' '; END LOOP; DBMS_OUTPUT.PUT_LINE('Result: ' || output); END IF; END print_nested_table; BEGIN answer := nt1 MULTISET UNION nt4; print_nested_table(answer); answer := nt1 MULTISET UNION nt3; print_nested_table(answer); answer := nt1 MULTISET UNION DISTINCT nt3; print_nested_table(answer); answer := nt2 MULTISET INTERSECT nt3; print_nested_table(answer); answer := nt2 MULTISET INTERSECT DISTINCT nt3; print_nested_table(answer); answer := SET(nt3); print_nested_table(answer); answer := nt3 MULTISET EXCEPT nt2; print_nested_table(answer); answer := nt3 MULTISET EXCEPT DISTINCT nt2; print_nested_table(answer); END; /
結果:
Result: 1 2 3 1 2 4 Result: 1 2 3 2 3 1 3 Result: 1 2 3 Result: 3 2 1 Result: 3 2 1 Result: 2 3 1 Result: 3 Result: empty set