コレクションは、指定した順序で同じ型の要素をグループ化します。 各要素には一意の添字が付いています。その番号によって、集合の中での要素の位置が決まります。
PL/SQLには次の3種類のコレクションがあります。
結合配列(以前の「PL/SQL表」または「索引付き表」)
ネストした表
可変サイズの配列(VARRAY)
結合配列は、整数または文字列で索引付けできます。 ネストした表およびVARRAYは、整数で索引付けできます。
コレクションを作成するには、まずコレクション型を定義し、次にその型の変数を宣言します。
注意: このトピックの内容は、PL/SQLブロックまたはパッケージ内で定義するコレクション型に適用されます。このコレクション型は、CREATE TYPE文を使用して作成するスタンドアロン・ストアド・コレクション型とは異なります。PL/SQLブロックまたはパッケージでは、3つすべてのコレクション型を定義できます。 |
構文
collection_type_definition ::=
assoc_array_type_def ::=
nested_table_type_def ::=
varray_type_def ::=
collection_variable_dec ::=
element_type ::=
キーワードとパラメータの説明
collection_name
定義したコレクション型の変数に付ける名前。
element_type
コレクション要素のデータ型(REF
CURSOR
を除く任意のPL/SQLデータ型)。
ネストした表の場合:
element_type
がオブジェクト型である場合、ネストした表型はオブジェクト型の名前および属性と一致する列を持つ表を表します。
element_type
がスカラー型である場合、ネストした表型はCOLUMN_VALUE
と呼ばれる単一のスカラー型の列を持つ表を表します。
element_type
にNCLOB
を指定することはできません。 CLOB
またはBLOB
を指定することはできます。
結合配列の場合は、その索引のデータ型(PLS_INTEGER
、BINARY_INTGER
またはVARCHAR2
)。
NOT NULL
コレクションの要素の値はNULL
にできないことを指定します。
size_limit
VARRAYの場合は、格納できる要素の最大数を指定する正の整数リテラル。 上限があります。 「コレクション要素の参照」を参照してください。
type_name
定義するコレクション型に付ける名前。
v_size
結合配列の場合は、索引付けの基準となるVARCHAR2
キーの長さ。
使用上の注意
結合配列の型定義は、ブロック、サブプログラム、パッケージ仕様部またはパッケージ本体の宣言部でのみ使用できます。
ネストした表またはVARRAYの型定義は、ブロック、サブプログラム、パッケージ仕様部またはパッケージ本体の宣言部(この場合はブロック、サブプログラムまたはパッケージに対してローカルになります)、あるいはCREATE TYPE文(この場合はスタンドアロン・ストアド型になります)のいずれかで使用できます。
ネストした表では結合配列の機能が拡張されているため、ネストした表と結合配列はいくつかの点で異なります。 「ネストした表と結合配列の選択」を参照してください。
ネストした表やVARRAYにオブジェクト型のインスタンスを格納したり、また、逆にネストした表やVARRAYがオブジェクト型の属性であったりします。
コレクションは、ほとんどの第3世代のプログラミング言語で見られる配列と同様の働きをします。 コレクションにあるのは、1次元のみです。 多次元配列のモデルを作成するには、他のコレクションを項目に持つコレクションを宣言します。
コレクションは、パラメータとして渡すことができます。 それらを使用して、データの列をデータベースの表に出し入れしたり、クライアント側アプリケーションとストアド・サブプログラムとの間でデータの列を移動できます。
すべての要素参照には、コレクション名およびカッコで囲まれた1つ以上の添字が含まれており、この添字によって、処理される要素が決まります。 負の添字を持つことができる結合配列を除き、コレクションの添字の下限は1(固定)です。マルチレベル・コレクションの添字は、任意の順序で評価されます。添字に、別の添字の値を変更する式が含まれている場合の結果は、未定義になります。 「コレクション要素の参照」を参照してください。
結合配列とネストした表は疎である(添字が連続していない)場合があります。ただし、VARRAYは常に密です(添字が連続しています)。 ネストした表とは異なり、VARRAYはデータベースに格納されるときにその順序と添字が保たれます。 最初、結合配列は疎です。 そのため、たとえば、主キー(口座番号や従業員番号など)を索引として使用して、参照データを一時変数に格納できます。
コレクションは、通常の有効範囲とインスタンス化の規則に従います。 パッケージの中では、そのパッケージが初めて参照された時点でコレクションのインスタンスが生成され、データベース・セッションが終わった時点で消滅します。 ブロックまたはサブプログラムの中で、ローカル・コレクションは、ブロックまたはサブプログラムに入ったときにインスタンス化され、ブロックまたはサブプログラムが終了した時点で消滅します。
ネストした表またはVARRAYは、初期化するまでは基本構造的にNULL(つまりコレクションの要素ではなく、コレクション自体がNULL)です。 ネストした表またはVARRAYを初期化するには、コンストラクタ(コレクション型と同じ名前のシステム定義ファンクション)を使用します。 このファンクションは、コレクションに渡される要素から、コレクションを構成(作成)します。
可能なコレクションの比較の詳細は、「コレクションの比較」を参照してください。
コレクションにオブジェクト型のインスタンスを格納したり、また、逆にコレクションがオブジェクト型の属性であったりします。 コレクションは、パラメータとして渡すこともできます。 それらを使用して、データの列をデータベースの表に出し入れしたり、クライアント側アプリケーションとストアド・サブプログラムとの間でデータの列を移動できます。
コレクションを戻すファンクションを起動する場合、次の構文を使用してコレクション内の要素を参照します。
function_name(parameter_list)(subscript)
例5-16「結合配列の要素の参照」および例B-2「ドット表記法を使用した名前の修飾」を参照してください。
Oracle Call Interface(OCI)またはOracleプリコンパイラを使用すると、サブプログラムの仮パラメータとして宣言された結合配列(索引付き表)にホスト配列をバインドできます。 これによって、ホスト配列をストアド・ファンクションやプロシージャに渡すことができます。
関連トピック