すべてのプロダクト
Search
ドキュメントセンター

PolarDB:連想配列

最終更新日:Jun 21, 2025

連想配列は、ハッシュテーブルと同様に使用できるキーと値のペアのセットです。可変長配列とネストテーブルの使い方は、配列の使用方法に似ています。

構文

パッケージまたはストアドプロシージャの 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