http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99981と2 つのリンクがあります 。
Oracle でさまざまなタイプの PL/SQL コレクションを使用する目的
上記の2つのリンクを参照することで、2つの疑問があります
1.正しいネストテーブルはどれ?
2.オラクルのドキュメントが正しい場合、ネストされたテーブルと連想配列の違いは何ですか?
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99981と2 つのリンクがあります 。
Oracle でさまざまなタイプの PL/SQL コレクションを使用する目的
上記の2つのリンクを参照することで、2つの疑問があります
1.正しいネストテーブルはどれ?
2.オラクルのドキュメントが正しい場合、ネストされたテーブルと連想配列の違いは何ですか?
あまり知られていない別の違いを次に示します。ネストされた 2 つのテーブルを比較することはでき=
ます<>
が、連想配列を使用することはできません。
DECLARE
TYPE associative_array IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
a_var_associative_array associative_array;
b_var_associative_array associative_array;
TYPE nested_table IS TABLE OF INTEGER;
a_var_nested_table nested_table := nested_table(1, 2, 3, 4, 5);
b_var_nested_table nested_table := nested_table(5, 4, 3, 2, 1);
BEGIN
IF a_var_nested_table = b_var_nested_table THEN
-- Note, the different order of values!
DBMS_OUTPUT.PUT_LINE ( 'TRUE' );
ELSE
DBMS_OUTPUT.PUT_LINE ( 'FALSE' );
END IF;
-- IF a_var_associative_array = b_var_associative_array THEN -> gives you an error!
END;
ネストされたテーブルを操作する場合、連想配列では使用できないMultiset Operators、Multiset Conditionsも使用できます。SET
ネストされたテーブルは、n 要素の単なる配列です。
declare
type nested_table_of_integer is table of integer;
v_my_nested_table nested_table_of_integer;
begin
v_my_nested_table := nested_table_of_integer(); -- initialize
v_my_nested_table.extend(10); -- add 10 elements
v_my_nested_table(1) := 100;
v_my_nested_table(11) := 1000; -- ORA-06533: Subscript beyond count
end;
ネストした表は、示されているように初期化する必要があります。最初はゼロ要素です。要素を追加するには、EXTEND を使用します。このネストされたテーブルには 10 個の要素があります。要素 1 の値は 100 です。その他の要素の値は null です。存在しない要素、たとえば 11 番目の要素にアクセスすると、エラーが発生します。
一方、連想配列は、名前と値のペアの配列です。命名に数字 (通常は pls_integer) を使用しましょう。
declare
type associative_array_of_integer is table of integer index by pls_integer;
v_my_associative_array associative_array_of_integer;
begin
v_my_associative_array(1) := 100;
v_my_associative_array(11) := 1000;
v_my_associative_array(12) := v_my_associative_array(2); -- ORA-01403: no data found
end;
連想配列には初期化は必要ありません。それは空であり、移入されます。ここでは、1 という要素を値 100 に関連付け、名前 11 の要素を値 1000 に関連付けます。したがって、配列には 2 つの要素があります。配列にない名前にアクセスしようとすると、データが見つからないという例外が発生します。
名前に文字列を使用することもできます。
declare
type associative_array_of_integer is table of integer index by varchar2(100);
v_my_associative_array associative_array_of_integer;
begin
v_my_associative_array('age father') := 39;
v_my_associative_array('age mother') := 32;
v_my_associative_array('age daughter') := 11;
end;
両方のコレクションを使用してテーブル データを取得できますが、使い方が異なります。ネストされたテーブルにはカウントがあり、1 からカウントまでループしてその要素にアクセスできます。
declare
type nested_table_of_integer is table of integer;
v_my_nested_table nested_table_of_integer;
begin
v_my_nested_table := nested_table_of_integer(); -- initialize
select table_name bulk collect into v_my_nested_table from user_tables;
for i in 1 .. v_my_nested_table.count loop
dbms_output.put_line(v_my_nested_table(i));
end loop;
end;
ただし、連想配列は、FIRST と NEXT を使用して、最初のインデックスから次へ、次へ、次へと読み取られる必要があります。
declare
type associative_array_of_integer is table of integer index by pls_integer;
v_my_associative_array associative_array_of_integer;
i integer;
begin
select table_name bulk collect into v_my_associative_array from user_tables;
i := v_my_associative_array.first;
while i is not null loop
dbms_output.put_line(v_my_associative_array(i));
i := v_my_associative_array.next(i);
end loop;
end;
ここでの「名前」はたまたま 1、2、3 などであり (バルク コレクションによって与えられます)、たとえば v_my_associative_array(1) にアクセスできます。ただし、プログラムの後半では、配列内のいくつかの可能な削除操作の後、ギャップが生じる可能性があるため、1 という名前の要素が存在するかどうか、および要素 4 の前の要素がたまたま要素 3 であるかどうかはわかりません。一括収集と同様に要素の「名前」には、実際には使用しないという意味はありませんが、代わりに、示されているようにチェーンを通過します。