オラクルでコレクションを使用する主な目的は何ですか?
表による索引
入れ子になったテーブル
可変サイズ ARRAY
上記のコレクションの種類の違いを説明していただけますか?
オラクルでコレクションを使用する主な目的は何ですか?
表による索引
入れ子になったテーブル
可変サイズ ARRAY
上記のコレクションの種類の違いを説明していただけますか?
ネストされたテーブルから始めましょう。これらはコレクションの最も一般的な形式であり、比較の有用な基礎を表しています。
ネストされたテーブルは、何かの複数のインスタンス (多くの場合、データベース テーブルのレコード) を保持できる変数です。次のように宣言できます。
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
同じことをしたいデータの複数のインスタンスを保存したいときはいつでも便利です。典型的な例は、BULK COLLECT を使用して複数のレコードを保存することです。
select *
bulk collect into emp_rec_nt
from employees;
これにより、ループできるデータのソースが得られます。重要なのは、前後にナビゲートできることです。最後や最初にスキップすることもできますが、これはカーソルでは実行できません。ネストした表は、PL/SQL レコードやユーザー定義型などのコンポジットを含む、任意のデータ型のコレクションにすることができます。
Index By テーブルは、(ドキュメントのように) Associative Array と呼ぶ方が適切です。これらは、インデックスを持つ単一の属性の単純なコレクションです。入れ子になったテーブルにもインデックスがありますが、そのインデックスは単なる行数です。連想配列を使用すると、インデックスを意味のあるものにすることができます。つまり、データ値から取得できます。そのため、後で使用するためにデータ値をキャッシュするのに役立ちます。インデックスは、数値または (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 のドキュメントでは、1 つの章全体がコレクションに費やされています。 詳細をご覧ください。
連想配列 (インデックス付きテーブルとも呼ばれます) を使用すると、添字値に任意の数値と文字列を使用して要素を検索できます。これらは、他のプログラミング言語のハッシュ テーブルに似ています。
ネストした表には、任意の数の要素が保持されます。これらは、添字として連番を使用します。同等の SQL 型を定義して、ネストされたテーブルをデータベース テーブルに格納し、SQL を介して操作できるようにすることができます。
VARRAY (可変サイズ配列の略) は固定数の要素を保持します (ただし、実行時に要素数を変更できます)。これらは、添字として連番を使用します。同等の SQL 型を定義して、VARRAY をデータベース テーブルに格納できます。これらは SQL を使用して格納および取得できますが、ネストされたテーブルよりも柔軟性が低くなります。
入れ子になったテーブルと連想配列 (以前はインデックス付きテーブルと呼ばれていた) はどちらも同様の添字表記を使用しますが、永続性とパラメーターの受け渡しの容易さに関しては異なる特性を持っています。
ネストした表はデータベース列に格納できますが、連想配列は格納できません。ネストされたテーブルを使用すると、通常は単一列のテーブルをより大きなテーブルに結合する SQL 操作を簡素化できます。
連想配列は、プロシージャが呼び出されるかパッケージが初期化されるたびにメモリ内でコレクションを構築できる比較的小さなルックアップ テーブルに適しています。サイズに制限がないため、事前に量が不明な情報を収集するのに適しています。連想配列の添え字は負の値にすることも、非連続にすることもでき、数値の代わりに文字列値を使用できるため、それらのインデックス値はより柔軟です。
PL/SQL は、数値キー値を使用するホスト配列と連想配列の間で自動的に変換します。データベース サーバーとの間でコレクションをやり取りする最も効率的な方法は、データ値を連想配列に設定し、それらの連想配列を一括構成 (FORALL ステートメントまたは BULK COLLECT 句) と共に使用することです。
VARRAY は、次の場合に適しています。
要素の数は事前にわかっています。
通常、要素はすべて順番にアクセスされます。
データベースに格納されると、varray はその順序と添字を保持します。
各 VARRAY は、単一のオブジェクトとして、それが列である表の内部 (VARRAY が 4KB 未満の場合) または表の外部で同じ表領域内 (VARRAY が 4KB を超える場合) に格納されます。varray のすべての要素を同時に更新または取得する必要があります。これは、すべての要素に対して何らかの操作を一度に実行する場合に最も適しています。ただし、この方法で多数の要素を格納および取得するのは実際的ではない場合があります。
ネストした表は、次の場合に適しています。
インデックス値が連続していません。
インデックス値のセット数はありません。ただし、上限が設けられています。
一部の要素を削除または更新する必要がありますが、一度にすべての要素を削除する必要はありません。
通常は、メイン テーブルの各行に複数のエントリを持つ個別のルックアップ テーブルを作成し、結合クエリを介してアクセスします。
ネストされたテーブルはまばらになる可能性があります。末尾からアイテムを削除するだけでなく、任意の要素を削除できます。
ネストした表のデータは、ネストした表に関連付けられたシステム生成のデータベース表である別のストア表に格納されます。ネストしたテーブルにアクセスすると、データベースがテーブルを結合します。これにより、ネストされたテーブルは、コレクションの一部の要素にのみ影響するクエリと更新に適したものになります。
順序と添え字はデータベースに保持されないため、ネストした表がデータベースに格納され、データベースから取得されるときに、ネストした表の順序と添え字が安定しているとは限りません。
コレクションを使用する主な目的は、アプリケーションのパフォーマンスを向上させることです。コレクションを使用することで、頻繁にアクセスして変更する必要がある静的データを「キャッシュ」できます。これにより、データベースへの呼び出しが減少します。
また、同様のタイプの多数のアイテムを処理する必要がある場合、これらのアイテムをコレクションに格納すると、各要素を簡単にループして、各要素をインデックスで参照できます。