このトピックでは、PL/SQLの3つのコレクションタイプの概要と、コレクションタイプの制限について説明します。
PL/SQLは、可変サイズ配列 (varray) 、ネストされたテーブル、および連想配列の3種類のコレクションを提供します。 コレクション型は、スキーマレベル、パッケージ、またはPL/SQLブロックで宣言できます。 各コレクションタイプには特別な使用法があります。 たとえば、コレクション型コンストラクター関数を使用して、varraysとネストされたテーブルを初期化したり、コレクションメソッドを使用してコレクションを追加、削除、クエリしたり、コレクションから値を取得したり、コレクションに値を割り当てたり、コレクションを使用してテーブルを操作したりできます。
次の表に、上記のコレクションタイプの違いを示します。
コレクションタイプ | 要素の数 | インデックス (下付き) タイプ | 未初期化状態 | Where defined |
Varray | 指定済み | 正の整数 | NULL | PL/SQLブロックまたはパッケージ、またはスキーマレベルで |
入れ子テーブル | 未指定 | 正の整数 | NULL | PL/SQLブロックまたはパッケージ、またはスキーマレベルで |
連想配列 | 未指定 | 正の整数または文字列 | Empty | PL/SQLブロックまたはパッケージ |
要素の数
要素数が指定されている場合、値はコレクション内の要素の最大数になります。 要素数が指定されていない場合、コレクション内の要素の最大数はインデックス型の上限です。
インデックス (下付き) タイプ
インデックスは、コレクション型の特定の位置にある要素を取得するために使用されます。
未初期化状態
上記のコレクションタイプには、NULL、空、およびpopulatedの3つの状態があります。 Varraysとネストされたテーブルは、前述の状態のいずれかになります。 varrayまたはネストされたテーブル変数が宣言されているが初期化されていない場合、変数のステータスはNULLになります。これは、変数によって指定されたコレクションが存在しないことを示します。 この場合、インデックスを使用してコレクション変数から要素を取得する場合、そのコレクションが存在しないことを示すエラーが報告されます。 コンストラクター関数を呼び出して、コレクション変数を初期化できます。 この場合、コレクション変数は空の状態になります。これは、コレクションが存在するが要素を含まないことを示します。 この場合、インデックスを使用してコレクション変数から要素を取得したい場合は、その要素が存在しないことを示すエラーが報告されます。 デフォルトでは、連想配列変数が宣言されると、変数は空の状態に初期化されます。 したがって、変数にはNULL状態がありません。
Where defined
PL/SQLブロックで定義されているコレクション型はローカル型です。 コレクションタイプはブロック内でのみ使用でき、ブロックがサブプログラム内にある場合にのみデータベースに格納されます。 スキーマレベルまたはパッケージで定義されたコレクションタイプは、データベースのシステムテーブルに永続的に格納されます。 コレクションの種類を削除する場合は、DROP typeまたはDROP PACKAGEコマンドを実行する必要があります。
制限
関連配列初期化コンストラクターはサポートされていません。
修飾式とイテレータの構築フォームはサポートされていません。
多次元コレクションタイプはサポートされていません。 コレクションタイプとレコードタイプのマルチレベルネストもサポートされていません。
MULTISET関連の操作はサポートされていません。DELETEコレクションメソッドを使用してコレクション変数から要素を削除し、プレースホルダーを保持する場合、予期しない結果を防ぐためにコレクション変数とテーブルを使用して操作を実行しないでください。IS [NOT] NULLを使用して、コレクション変数がNULL状態かどうかを判断できます。 ただし、=、<、または>演算子を使用してコレクション変数間の等式または不等式を比較した場合、返される結果は無意味です。