このチュートリアルでは、Oracle PL / SQLコレクション(ネストされたテーブル)を宣言および初期化する方法を学習します。
Oracle PL/SQL-ネストされたテーブル
ネストされた表は、Oracleではindex-by
として知られているPL/SQL表と非常によく似ています。 テーブル。ネストされたテーブルは、index-by
の機能を拡張します 追加の収集メソッド(index-by
のテーブル属性と呼ばれる)を追加してテーブルを作成します テーブル)およびデータベーステーブル内にネストされたテーブルを格納する機能を追加することにより、ネストされたテーブルと呼ばれる理由です。
ネストされたテーブルは、SQLを使用して直接操作することもでき、追加の事前定義された例外を利用できます。
これらの追加機能を除いて、ネストされた表の基本的な機能はPL/SQL表と同じです。ネストされたテーブルは、キーと値の2つの列を持つデータベーステーブルと見なすことができます。 index-tables
のように 、ネストされたテーブルはまばらである可能性があり、キーはシーケンシャルである必要はありません。
ネストされたテーブルの宣言
ネストされたテーブルタイプを作成するための構文は次のとおりです
TYPE table_name is TABLE OF table_type [NOT NULL];
ここで、table_nameは新しいタイプの名前であり、table_type
ネストされたテーブルの各要素のタイプです。 Table_type
組み込み型、ユーザー定義のオブジェクト型、または%
を使用する式にすることができます タイプ。
注
index-byテーブルとネストされたテーブルの唯一の構文上の違いは、INDEXBYBINARY_INTEGER句が存在することです。この句が存在しない場合、タイプはネストされたテーブルタイプです。この句が存在する場合、タイプはインデックステーブルタイプです。
コードの次の宣言型セクションは、いくつかの有効なテーブル宣言を示しています。
DECLARE --Define a table type based on an object type TYPE t_ClassTab IS TABLE OF Classobj; --A type based on%ROWTYPE Type t_StudentsTab IS TABLE Of students%ROWTYPE; --Variables of the above types v_ClassList t_ClassesTab; v_StudentList t_StudentsTab;
Oracle PL/SQL-ネストされた表の初期化
前のブロックのようにテーブルが宣言されると、オブジェクトタイプのように、アトミックにNULLになるように初期化されます。 NULLテーブルに割り当てようとすると、エラー「 ORA-6531:初期化されていないコレクションへの参照」が表示されます。 "これは、事前定義された例外COLLECTION_IS_NULL
に対応します 、上げられます。
前の例を続けると、次の実行セクションでこのエラーが発生します:
BEGIN --This assignment will raise COLLECTION_IS_NULL because --v_ClassList is automatically null. v_ClassList(1) := ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL); END;
では、ネストされたテーブルをどのように初期化しますか?これは、コンストラクターを使用して実行できます。オブジェクト型コンストラクターと同様に、ネストされたテーブルのコンストラクターは、テーブル型自体として同じ名前を持ちます。ただし、引数として要素のリストを取ります。各要素は、テーブル要素タイプとタイプ互換である必要があります。
次の例は、nsat3eedテーブルコンストラクターの使用法を示しています。
DECLARE TYPE t_NUmbersTab IS TABLE OF NUMBER; -- Create a table with one element. v_Tab1 t_NumbersTab := t_NumbersTab(-1); -- Create a table with five elements. v-Primes t_numbersTab := t_NumbersTab(1, 2, 3 , 5, 7); -- Craete a table with no elemnts. v_Tab2 t_NumbersTab := t_NumbersTab(); BEGIN -- Assign to v_Tab1(1). This will replace the value ready -- in v_Tab(1), which was initilized to -1. v_Tab(1) := 12345; END;に初期化されたv_Tab(1)のready--の値が置き換えられます。
空のテーブル
v_Tab2
の宣言に注意してください 前のブロック:
-- Create a table with no elements. v_Tab2 t_NumbersTab := t_NumbersTab();
v_Tab2
引数なしでコンストラクターを呼び出すことによって初期化されます。これにより、要素はないがアトミックにNULLではないテーブルが作成されます。次のブロックはこれを示しています:
DECLARE TYPE t_WordsTab IS TABLE OF VARCHAR2(50); --Create a NULL table. v_Tab1 t_WordsTab; --Create a table with one element, which itself is NULL. v_Tab2 t_WordsTab := t_WordsTab(); BEGIN IF v_Tab1 IS NULL THEN DBMS_OUTPUT.PUT_LINE('v_Tab1 is NULL'); ELSE DBMS_OUTPUT.PUT_LINE('v_Tab is not NULL'); END IF; IF v_Tab2 IS NULL THEN DBMS_OUTPUT.PUT_LINE('v_Tab2 is NULL'); ELSE DBMS_OUTPUT.PUT_LINE('v_Tab2 is not NULL'); END IF; END;
このブロックを実行すると、次の出力が得られます。
v_Tab1 is NULL v_Tab2 is not NULL
初期化時のキー
コンストラクターを使用してテーブルを初期化する場合、テーブルの要素には、1からコンストラクター呼び出しで指定された要素の数までの範囲で順番に番号が付けられます。後の処理中に、一部のキーに保存されている値が削除される場合があります(DELETEメソッドを使用)。ネストされたテーブルがデータベースから選択されると、必要に応じて、初期化時と同じようにキーの番号が付け直されます。