全部產品
Search
文件中心

PolarDB:關聯陣列

更新時間:Jun 21, 2025

區別於變長數組和巢狀表格的形如數組的使用形式,關聯陣列(associative array)是一組索引值對,使用形式更像是雜湊表。

文法

關聯陣列支援在包和預存程序聲明段(即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); -- 聲明 associative array 局部類型
    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部分,用於聲明索引的類型。索引的排序方式由索引類型的排序次序決定。目前支援正整數或字串作為索引類型。關聯陣列會被預設初始化為空白,因此您可以對特定索引位置直接進行賦值。如果在取值前沒有對該索引位置進行賦值,會出現不存在該元素的錯誤。以下是一個嘗試擷取不存在的元素的樣本:

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);  -- 聲明 associative array 全域類型
    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);  -- 聲明 associative array 全域類型
    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);  -- 聲明 associative array 全域類型
    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

三維關聯陣列

關聯陣列目前最多支援三維,以下是一個使用三維關聯陣列的樣本:

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