ネストされたテーブルから始めましょう。これらはコレクションの最も一般的な形式であるため、比較の有用な基礎となります。
ネストされたテーブルは、何かの複数のインスタンス(多くの場合、データベーステーブルのレコード)を保持できる変数です。これらは次のように宣言される可能性があります:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
同じことをしたいデータの複数のインスタンスを保存したいときはいつでも便利です。典型的な例は、BULKCOLLECTを使用して複数のレコードを保存することです。
select *
bulk collect into emp_rec_nt
from employees;
これにより、ループできるデータのソースが得られます。重要なのは、カーソルではできないことである、最後または最初にスキップすることでさえ、前方だけでなく後方にもナビゲートできることです。ネストされた表は、PL / SQLレコードやユーザー定義型などのコンポジットを含む、任意のデータ型のコレクションにすることができます。
Index Byテーブルは、(ドキュメントのように)連想配列と呼ばれる方が適切です。これらは、単一の属性の単純なコレクションです。 インデックス付き。ネストされたテーブルにもインデックスがありますが、それらのインデックスは単なる行数です。連想配列を使用すると、インデックスは意味のあるものになります。つまり、データ値から取得されます。したがって、後で使用するためにデータ値をキャッシュするのに役立ちます。インデックスは数値、または(9iR2以降)非常に便利な文字列にすることができます。たとえば、これは従業員IDによってインデックス付けされた給与の連想配列です。
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
INDEX BY BINARY_INTEGERを使用してその配列を宣言することもできますが、代わりに%TYPE構文を使用する方が明確です(自己文書化コード)。その配列の要素は、インデックス値(この場合はEMPNO)で識別できます。
l_emp_sals(l_emp_no) := l_emp_sal;
参照テーブルまたは同様のルックアップ値をキャッシュする以外に、連想配列のユースケースは多くありません。
変数配列は、要素数に事前定義された制限があるネストされたテーブルです。したがって、おそらくその名前は誤解を招く可能性があります。実際には固定配列です。ネストされたテーブルでは実行できないVArrayで実行できることはほとんどありません(要素の数を制限することを除いて、それを実行することは非常にまれです)。それらは次のように宣言されます:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
バルクコレクトを使用してVArrayにデータを入力できます...
select *
bulk collect into emp_rec_va
from employees;
ただし、クエリが最大でを返すことを確認する必要があります VArrayの宣言で指定された要素の数。それ以外の場合、SELECTはORA-22165を投げます。
可変配列の既知の使用例はありません。少し厳しいですが、ほとんどの場合、代わりにネストされたテーブルを使用します。ネストされたテーブルに対するVArrayの大きな利点の1つは、要素の順序が保証されることです。したがって、要素を挿入したのと同じ順序で要素を取得する必要がある場合は、VArrayを使用してください。
PL / SQLのドキュメントでは、章全体をコレクションに当てています。詳細をご覧ください。