コレクションのコンストラクタは、コレクション型と同名のシステム定義関数であり、その型のコレクションを返します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
説明
コンストラクタは可変配列とネスト表にのみ適用されます。関連配列にはコンストラクタがありません。本記事で言及しているコレクションとは、可変配列またはネスト表を指します。
コンストラクタを呼び出す構文は次のとおりです:
collection_type ( [ value [, value ]... ] )
ここで、collection_type は事前に宣言されたネスト表型または可変配列型(関連配列型ではない)の名前を指します。value はコレクション要素 collection_type の有効な値を指します。collection_type が可変配列型の場合、最大値が存在し、値の数はその最大値を超えてはなりません。collection_type がネスト表型の場合、最大値はありません。
パラメータリストが空の場合、コンストラクタは空のコレクションを返します。それ以外の場合、コンストラクタは指定された値を含むコレクションを返します。
変数宣言時やブロックの実行部で、戻り値のコレクションを(同じ型の)コレクション変数に代入できます。
例:コレクション変数を空値に初期化する。
obclient> DECLARE
TYPE players IS VARRAY(5) OF VARCHAR2(20);
team PLAYERS := players(); --空値に初期化
PROCEDURE print_team (heading VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(heading);
IF team.COUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('Empty');
ELSE
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i || '.' || team(i));
END LOOP;
END IF;
DBMS_OUTPUT.PUT_LINE('---');
END;
BEGIN
print_team('Team Members:');
team := players('Charles', 'Carl', 'James', 'Gary','Brian');
print_team('Team Members:');
END;
/
Query OK, 0 rows affected
Team Members:
Empty
---
Team Members:
1.Charles
2.Carl
3.James
4.Gary
5.Brian
---
上記の例では、コンストラクタが2回呼び出されています。最初に可変配列変数 team を空値に初期化し、その後ブロックの実行部で新しい値を代入します。print_team ストアドプロシージャは、team の初期値と最終値を表示します。print_team はコレクションメソッド COUNT を使用して、team が空かどうかを判断します。
例:コンストラクタでインデックスと要素を指定する関連配列
obclient> declare
-> type rec_type is record (
-> id number,
-> name varchar2(50),
-> salary number
-> );
-> type ty_rec is table of rec_type index by PLS_INTEGER;
-> v_rec ty_rec;
-> idx PLS_INTEGER;
-> begin
-> v_rec := ty_rec(1 => rec_type(1, 'Alice', 5000),2 => rec_type(2, 'Bob', 6000),3 => rec_type(3, 'Charlie', 7000));
-> idx := v_rec.FIRST();
-> while idx is not null loop
-> dbms_output.put_line('ID: ' || v_rec(idx).id || ', Name: ' || v_rec(idx).name || ', Salary: ' || v_rec(idx).salary);
-> idx := v_rec.NEXT(idx);
-> end loop;
-> end;
-> /
Query OK, 0 rows affected (0.146 sec)
結果は次のとおりです:
ID: 1, Name: Alice, Salary: 5000
ID: 2, Name: Bob, Salary: 6000
ID: 3, Name: Charlie, Salary: 7000
上記の例では、まず record 型を定義し、次に ty_rec という関連配列型を定義します。index は PLS_INTEGER 型、element 型は rec_type 型です。v_rec は ty_rec 型の関連配列変数で、=> を伴うコンストラクタを使用して index と対応する element を指定します。その後、関連配列を列挙してすべての要素を順に出力します。 関連配列は、index を指定しないコンストラクタ(つまり => を伴わないコンストラクタで、index が PLS_INTEGER 型の場合に限る)もサポートしています。この場合、index はデフォルトで 1 から始まって増分カウントされます。例:
obclient> declare
-> type ty1 is table of int index by PLS_INTEGER;
-> x ty1;
-> idx PLS_INTEGER;
-> begin
-> x := ty1(10, 20, 30);
-> idx := x.FIRST();
-> while idx is not null loop
-> dbms_output.put_line('index: ' || idx || ', Element: ' || x(idx));
-> idx := x.NEXT(idx);
-> end loop;
-> end;
-> /
Query OK, 0 rows affected (0.122 sec)
結果は次のとおりです:
```shell
index: 1, Element: 10
index: 2, Element: 20
index: 3, Element: 30
上記の例では、まず index が PLS_INTEGER 型、element 型が int 型の関連配列型 ty1 を宣言し、次に x を ty1 型の変数として宣言します。その後、ty1 のコンストラクタ内で直接 element の値を指定して x に代入し、x の index と element を順に走査して出力します。