sql >> データベース >  >> RDS >> Oracle

OracleでさまざまなタイプのPL/SQLコレクションを使用する目的

    ネストされたテーブルから始めましょう。これらはコレクションの最も一般的な形式であるため、比較の有用な基礎となります。

    ネストされたテーブルは、何かの複数のインスタンス(多くの場合、データベーステーブルのレコード)を保持できる変数です。これらは次のように宣言される可能性があります:

    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のドキュメントでは、章全体をコレクションに当てています。詳細をご覧ください。



    1. LINQforJavaツール

    2. SELECTステートメントの前の行の値にアクセスする方法はありますか?

    3. PostgreSQLメジャーバージョン8.4.x/9.3.xのアップグレード中のSlony-Iでのスイッチオーバー/スイッチバック

    4. 2つの列の組み合わせに対する一意の制約?