varrayまたはvariable-size配列は、正の整数を値に関連付けるコレクションの一種です。 多くの点で、ネストされたテーブルに似ています。
varrayには次の特性があります。
- varray型は、最大サイズ制限とともに定義する必要があります。 varray型が定義された後、varray変数はそのvarray型で宣言できます。 データ操作は、varray変数または略して「varray」を使用して行われます。 varrayの要素数は、varray型定義で設定されている最大サイズ制限を超えることはできません。
- varray変数が宣言されると、varrayは最初は存在しません (nullコレクションです) 。 null varrayは、コンストラクターで初期化する必要があります。 代入文を使用してvarrayを初期化することもできます。代入文の右側は同じ型の初期化されたvarrayです。
- キーは正の整数です。
- コンストラクタは、varray内の要素の数を設定します。これは最大サイズ制限を超えてはなりません。 EXTENDメソッドは、最大サイズ制限までvarrayに要素を追加できます。
- ネストされたテーブルとは異なり、varrayはスパースにすることはできません。キーへの値の割り当てにはギャップがありません。
- 初期化サイズまたは拡張サイズを超えて最大サイズ制限内のvarray要素を参照しようとすると、SUBSCRIPT_BEYOND_COUNT例外が発生します。
- varray要素を最大サイズ制限を超えて参照するか、varrayを最大サイズ制限を超えて拡張すると、SUBSCRIPT_OUTSIDE_LIMIT例外が発生します。
TYPE IS VARRAYステートメントは、SPLプログラムの宣言セクション内でvarray型を定義するために使用されます。
TYPE varraytype IS { VARRAY | VARYING ARRAY }(maxsize)
OF { datatype | objtype };
varraytypeは、varray型に割り当てられた識別子です。 datatypeは、VARCHAR2やNUMBERなどのスカラーデータ型です。 maxsizeは、その型のvarrayで許可される要素の最大数です。 objtype は、以前に定義されたオブジェクト型です。
CREATE TYPEステートメントを使用して、データベース内のすべてのSPLプログラムで使用できるvarray型を定義できます。 varrayを使用するには、そのvarray型の変数を宣言する必要があります。 以下は、varray変数を宣言するための構文です。
varray varraytype
varrayは、varrayに割り当てられた識別子です。 varraytypeは、定義済みのvarray型の識別子です。
varrayは、varray型のコンストラクターを使用して初期化されます。
varraytype ([ { expr1 | NULL } [, { expr2 | NULL } ])
[, ...] ])
varraytypeは、varray型のコンストラクターの識別子で、varray型と同じ名前を持ちます。 expr1、expr2、... は、varrayの要素型と型互換性のある式です。 NULLが指定された場合、対応する要素はnullに設定されます。 パラメーターリストが空の場合、空のvarrayが返されます。これは、varrayに要素がないことを意味します。 varrayがオブジェクト型から定義されている場合、exprnはそのオブジェクト型のオブジェクトを返す必要があります。 オブジェクトには、関数の戻り値またはオブジェクト型のコンストラクタの戻り値を指定できます。 オブジェクトは、同じvarray型の別のvarrayの要素にすることもできます。
EXISTS以外のコレクションメソッドが初期化されていないvarrayに適用されると、COLLECTION_IS_NULL例外がスローされます。
次の例は、varrayのコンストラクターを示しています。
DECLARE
タイプvarray_typはCHAR(1) のVARRAY(2) です。
v_varray varray_typ := varray_typ('A','B');
varrayの要素は、次の構文を使用して参照されます。
varray(n)[.element ]
varrayは、以前に宣言されたvarrayの識別子です。 nは正の整数である。 varrayのvarray型がオブジェクト型から定義されている場合、[.element] はvarray型が定義されているオブジェクト型内の属性を参照する必要があります。 あるいは、[.element] を省略してオブジェクト全体を参照することもできます。
次の例は、4つの要素が存在することがわかっているvarrayを示しています。
DECLARE
TYPE dname_varray_typはVARCHAR2(14) のVARRAY(4) です。
dname_varray dname_varray_typ;
CURSOR dept_cur IS SELECT dname FROM dept ORDER BY dname;
i INTEGER := 0;
開始
dname_varray := dname_varray_typ(NULL, NULL, NULL, NULL);
dept_curループでr_deptのため
i := i + 1;
dname_varray(i) := r_dept.dname;
END LOOP;
DBMS_OUTPUT.PUT_LINE('DNAME');
DBMS_OUTPUT.PUT_LINE('---------');
FOR j IN 1 .. iループ
DBMS_OUTPUT.PUT_LINE(dname_varray(j));
エンドループ;
エンド;
上記の例では、次の出力が生成されます。
DNAME
----------
会計
操作
研究
販売