Varrays¶
varray*または*variable-sizearray は、正の整数を値に関連付けるコレクションのタイプです。多くの点で、ネストされたテーブルに似ています。
VARRAYには次の特性があります。
varraytype*は、最大サイズ制限とともに定義する必要があります。VARRAY型が定義された後、そのVARRAY型の*varray変数 を宣言できます。データ操作は、VARRAY変数、または単に「varray」を使用して行われます。VARRAYの要素の数は、VARRAY型定義で設定された最大サイズ制限を超えることはできません。
VARRAY変数が宣言されると、VARRAYは最初は存在しません(NULLコレクションです)。NULLVARRAYは、コンストラクタ で初期化する必要があります。また、代入文を使用して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
TYPE varray_typ IS VARRAY(2) OF CHAR(1);
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 IS VARRAY(4) OF VARCHAR2(14);
dname_varray dname_varray_typ;
CURSOR dept_cur IS SELECT dname FROM dept ORDER BY dname;
i INTEGER := 0;
BEGIN
dname_varray := dname_varray_typ(NULL, NULL, NULL, NULL);
FOR r_dept IN dept_cur LOOP
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 LOOP
DBMS_OUTPUT.PUT_LINE(dname_varray(j));
END LOOP;
END;
上記の例では、次の出力が生成されます。
DNAME
----------
ACCOUNTING
OPERATIONS
RESEARCH
SALES