連想配列は、ハッシュテーブルと同様に使用できるキーと値のペアのセットです。可変長配列とネストテーブルの使い方は、配列の使用方法に似ています。
構文
パッケージまたはストアドプロシージャの DECLARE
セクションで連想配列を宣言できます。次の宣言構文を参照してください。
TYPE type_name IS TABLE OF value_type [ NULL | NOT NULL ] INDEX BY key_type ';'
key_type
は、文字型(VARCHAR2
など)と数値型(INTEGER
など)のみをサポートしています。
例
基本的な使い方
DECLARE
TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); -- 連想配列のローカル型を宣言します。
PROCEDURE set_array(aarray IN OUT aarray_type) IS
i INT;
BEGIN
FOR i IN 1..5 LOOP
aarray(i) := i; -- 値を割り当てます。
END LOOP;
END;
aarray aarray_type; -- 変数を作成します。
BEGIN
set_array(aarray);
RAISE NOTICE '%', aarray; -- 値を取得します。
END;
サンプル結果:
NOTICE: {1,2,3,4,5}
DO
連想配列のインデックスタイプを宣言する
ネストテーブルと比較して、連想配列の宣言構文は、INDEX BY index_type
を使用してインデックスタイプを宣言します。インデックスのソート方法は、インデックスタイプのソート順序によって決まります。インデックスタイプは、正の整数または文字列です。連想配列は、デフォルトで空として初期化されます。特定のインデックス位置に値を割り当てることができます。インデックス位置から値を取得する前に、インデックス位置に値を割り当てないと、associative arrays element does not exist
というエラーメッセージが発生します。存在しない要素を取得しようとした場合の例を次に示します。
DECLARE
TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10);
aarray aarray_type;
BEGIN
RAISE NOTICE '%', aarray('b');
END;
サンプル結果:
ERROR: associatvie arrays element is not exist
CONTEXT: PL/SQL function inline_code_block line 5 at RAISE
パッケージで連想配列を宣言して使用する
パッケージで連想配列変数を宣言し、ストアドプロシージャの OUT
パラメーターを使用して値を割り当てます。
CREATE OR REPLACE PACKAGE test_package IS
TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); -- 連想配列のグローバル型を宣言します。
PROCEDURE set_array(aarray IN OUT aarray_type);
END;
CREATE OR REPLACE PACKAGE BODY test_package IS
PROCEDURE set_array(aarray IN OUT aarray_type) IS
i INT;
BEGIN
FOR i IN 1..5 LOOP
aarray(i) := i; -- 値を割り当てます。
END LOOP;
END;
END;
DECLARE
aarray test_package.aarray_type; -- 変数を作成します。
BEGIN
test_package.set_array(aarray);
RAISE NOTICE '%', aarray; -- 値を取得します。
END;
サンプル結果:
NOTICE: {1,2,3,4,5}
DO
連想配列を関数の OUT パラメーターと戻り値として使用する
CREATE OR REPLACE PACKAGE test_package IS
TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); -- 連想配列のグローバル型を宣言します。
FUNCTION get_array(aarray IN OUT aarray_type) RETURN aarray_type;
END;
CREATE OR REPLACE PACKAGE BODY test_package IS
FUNCTION get_array(aarray IN OUT aarray_type) RETURN aarray_type IS
i INT;
BEGIN
FOR i IN 1..5 LOOP
aarray(i) := i + 100;
END LOOP;
RETURN aarray;
END;
END;
DECLARE
aarray1 test_package.aarray_type;
aarray2 test_package.aarray_type;
BEGIN
aarray2 := test_package.get_array(aarray1);
RAISE NOTICE 'aarray1 is %', aarray1; -- 値を取得します。
RAISE NOTICE 'aarray2 is %', aarray2; -- 値を取得します。
aarray1(1) := 1;
aarray1(2) := 2;
aarray1(3) := 3;
aarray1(4) := 4;
aarray1(5) := 5;
RAISE NOTICE 'aarray1 is %', aarray1; -- 値を取得します。
RAISE NOTICE 'aarray2 is %', aarray2; -- 値を取得します。
END;
サンプル結果:
NOTICE: aarray1 is {101,102,103,104,105}
NOTICE: aarray2 is {101,102,103,104,105}
NOTICE: aarray1 is {1,2,3,4,5}
NOTICE: aarray2 is {101,102,103,104,105}
DO
次の例に示すように、DECLARE
セクションで連想配列を宣言できます。期待される出力は同じです。
DECLARE
TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); -- 連想配列のグローバル型を宣言します。
FUNCTION get_array(aarray IN OUT aarray_type) RETURN aarray_type IS
i INT;
BEGIN
FOR i IN 1..5 LOOP
aarray(i) := i + 100;
END LOOP;
RETURN aarray;
END;
aarray1 aarray_type;
aarray2 aarray_type;
BEGIN
aarray2 := get_array(aarray1);
RAISE NOTICE 'aarray1 is %', aarray1; -- 値を取得します。
RAISE NOTICE 'aarray2 is %', aarray2; -- 値を取得します。
aarray1(1) := 1;
aarray1(2) := 2;
aarray1(3) := 3;
aarray1(4) := 4;
aarray1(5) := 5;
RAISE NOTICE 'aarray1 is %', aarray1; -- 値を取得します。
RAISE NOTICE 'aarray2 is %', aarray2; -- 値を取得します。
END;
連想配列を関数の引数として使用する
連想配列が関数の引数として使用される場合、IN パラメーターは関数またはプロシージャ内で変更できません。連想配列が OUT パラメーターとして使用される場合、関数またはプロシージャ内で変更できます。
連想配列を IN パラメーターとして使用する場合:
DECLARE TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); PROCEDURE set_array(aarray IN aarray_type) IS i INT; BEGIN FOR i IN 1..5 LOOP aarray(i) := i; END LOOP; END; aarray aarray_type; BEGIN set_array(aarray); END;
サンプル結果:
ERROR: variable "aarray" is declared CONSTANT
連想配列を OUT パラメーターとして使用する場合:
DECLARE TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10); PROCEDURE set_array(aarray OUT aarray_type) IS i INT; BEGIN FOR i IN 1..5 LOOP aarray(i) := i; END LOOP; END; aarray aarray_type; BEGIN set_array(aarray); RAISE NOTICE '%', aarray; END;
サンプル結果:
NOTICE: {1,2,3,4,5} DO
3 次元連想配列
連想配列は最大 3 次元までサポートしています。次の例は、3 次元連想配列を宣言、入力、および操作する方法を示しています。
DECLARE TYPE aarray_type1 IS TABLE OF INT INDEX BY VARCHAR(10); TYPE aarray_type2 IS TABLE OF aarray_type1 INDEX BY VARCHAR(10); TYPE aarray_type3 IS TABLE OF aarray_type2 INDEX BY VARCHAR(10); aarray aarray_type3; BEGIN aarray('a')('b')('c') := 1; aarray('a')('b')('d') := 2; aarray('a')('b')('e') := 3; aarray('a')('b')('f') := 4; RAISE NOTICE '%', aarray('a')('b'); aarray('a')('b').delete('c'); RAISE NOTICE '%', aarray('a')('b'); RAISE NOTICE '%', aarray('a')('b').first; RAISE NOTICE '%', aarray('a')('b').last; RAISE NOTICE '%', aarray('a')('b').count; RAISE NOTICE '%', aarray('a')('b').next('d'); RAISE NOTICE '%', aarray('a')('b').exists('d'); END;
サンプル結果:
NOTICE: {1,2,3,4} NOTICE: {2,3,4} NOTICE: d NOTICE: f NOTICE: 3 NOTICE: e NOTICE: t