全部产品
Search
文档中心

PolarDB:Array asosiatif

更新时间:Jul 02, 2025

Array asosiatif adalah jenis koleksi yang mengaitkan kunci unik dengan nilai. Array ini dapat menggunakan bilangan bulat atau string sebagai kunci.

Berikut adalah karakteristik array asosiatif:

  • Tipe array asosiatif harus didefinisikan sebelum variabel array dari tipe tersebut dapat dinyatakan. Manipulasi data dilakukan melalui variabel array.
  • Ketika variabel array dideklarasikan, array asosiatif kosong dibuat. Anda dapat menetapkan nilai ke elemen array.
  • Jika INDEXBY BINARY_INTEGER atau PLS_INTEGER ditentukan, kunci dari array asosiatif bisa berupa bilangan bulat negatif, positif, atau nol.
  • Jika INDEXBY VARCHAR2 ditentukan, kunci dari array asosiatif bisa berupa string.
  • Tidak ada batas yang telah ditentukan untuk jumlah elemen dalam array. Jumlahnya bertambah secara dinamis saat elemen ditambahkan.
  • Array asosiatif bisa bersifat jarang (sparse), yang berarti mungkin ada celah dalam penugasan nilai ke kunci.
  • Upaya untuk merujuk elemen array yang belum diberi nilai akan menghasilkan pengecualian.

Pernyataan TYPE IS TABLE OF ... INDEX BY digunakan untuk mendefinisikan tipe array asosiatif.

TYPE assoctype IS TABLE OF { datatype | rectype | objtype }
  INDEX BY { BINARY_INTEGER | PLS_INTEGER | VARCHAR2(n) };

assoctype menentukan pengenal untuk tipe array. datatype menentukan tipe data skalar, seperti VARCHAR2 atau NUMBER. rectype menentukan tipe rekaman yang telah didefinisikan sebelumnya. objtype menentukan tipe objek yang telah didefinisikan sebelumnya. n menentukan panjang maksimum kunci karakter.

Untuk menggunakan tipe array, Anda harus mendeklarasikan variabel dari tipe array tersebut. Sintaksis berikut digunakan untuk mendeklarasikan variabel array:

array assoctype

Dalam sintaksis sebelumnya, array menunjukkan pengenal yang ditetapkan ke array asosiatif. assoctype menunjukkan pengenal untuk tipe array yang telah didefinisikan sebelumnya.

Sintaksis berikut dapat digunakan untuk merujuk elemen dari array:

array(n)[.field ]

array menunjukkan pengenal untuk array yang telah dideklarasikan sebelumnya. n menunjukkan nilai dari tipe data yang ditentukan oleh klausa INDEX BY. Jika array didefinisikan dari tipe rekaman atau tipe objek, [.field] harus merujuk pada bidang individu yang didefinisikan dalam tipe rekaman atau atribut dalam tipe objek dari mana tipe array didefinisikan. Untuk merujuk seluruh rekaman, hilangkan [.field].

Kode berikut memberikan contoh tentang cara membaca sepuluh nama karyawan pertama dari tabel emp, menyimpannya dalam array, dan kemudian menampilkan data dari array:

DECLARE
    TYPE emp_arr_typ IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
    emp_arr         emp_arr_typ;
    CURSOR emp_cur IS SELECT ename FROM emp WHERE ROWNUM <= 10;
    i               INTEGER := 0;
BEGIN
    FOR r_emp IN emp_cur LOOP
        i := i + 1;
        emp_arr(i) := r_emp.ename;
    END LOOP;
    FOR j IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(emp_arr(j));
    END LOOP;
END;

Setelah kode sebelumnya dijalankan, keluaran sampel berikut dihasilkan:

SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER

Contoh ini dapat dimodifikasi untuk menggunakan tipe rekaman dalam definisi array.

DECLARE
    TYPE emp_rec_typ IS RECORD (
        empno       NUMBER(4),
        ename       VARCHAR2(10)
    );
    TYPE emp_arr_typ IS TABLE OF emp_rec_typ INDEX BY BINARY_INTEGER;
    emp_arr         emp_arr_typ;
    CURSOR emp_cur IS SELECT empno, ename FROM emp WHERE ROWNUM <= 10;
    i               INTEGER := 0;
BEGIN
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FOR r_emp IN emp_cur LOOP
        i := i + 1;
        emp_arr(i).empno := r_emp.empno;
        emp_arr(i).ename := r_emp.ename;
    END LOOP;
    FOR j IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(emp_arr(j).empno || '     ' ||
            emp_arr(j).ename);
    END LOOP;
END;

Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:

EMPNO    ENAME
-----    -------
7369     SMITH
7499     ALLEN
7521     WARD
7566     JONES
7654     MARTIN
7698     BLAKE
7782     CLARK
7788     SCOTT
7839     KING
7844     TURNER

Contoh ini dapat dimodifikasi lebih lanjut untuk menggunakan atribut emp%ROWTYPE guna mendefinisikan emp_arr_typ, alih-alih menggunakan tipe rekaman emp_rec_typ. Kode berikut memberikan contoh:

DECLARE
    TYPE emp_arr_typ IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
    emp_arr         emp_arr_typ;
    CURSOR emp_cur IS SELECT empno, ename FROM emp WHERE ROWNUM <= 10;
    i               INTEGER := 0;
BEGIN
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FOR r_emp IN emp_cur LOOP
        i := i + 1;
        emp_arr(i).empno := r_emp.empno;
        emp_arr(i).ename := r_emp.ename;
    END LOOP;
    FOR j IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(emp_arr(j).empno || '     ' ||
            emp_arr(j).ename);
    END LOOP;
END;

Dalam hal ini, keluaran sampelnya sama dengan contoh sebelumnya.

Alih-alih menetapkan setiap bidang rekaman secara individual, penugasan tingkat rekaman dapat dilakukan dari r_emp ke emp_arr.

DECLARE
    TYPE emp_rec_typ IS RECORD (
        empno       NUMBER(4),
        ename       VARCHAR2(10)
    );
    TYPE emp_arr_typ IS TABLE OF emp_rec_typ INDEX BY BINARY_INTEGER;
    emp_arr         emp_arr_typ;
    CURSOR emp_cur IS SELECT empno, ename FROM emp WHERE ROWNUM <= 10;
    i               INTEGER := 0;
BEGIN
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FOR r_emp IN emp_cur LOOP
        i := i + 1;
        emp_arr(i) := r_emp;
    END LOOP;
    FOR j IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE(emp_arr(j).empno || '     ' ||
            emp_arr(j).ename);
    END LOOP;
END;

Kunci dalam array asosiatif bisa berupa string seperti yang ditunjukkan dalam contoh berikut:

DECLARE
    TYPE job_arr_typ IS TABLE OF NUMBER INDEX BY VARCHAR2(9);
    job_arr         job_arr_typ;
BEGIN
    job_arr('ANALYST')   := 100;
    job_arr('CLERK')     := 200;
    job_arr('MANAGER')   := 300;
    job_arr('SALESMAN')  := 400;
    job_arr('PRESIDENT') := 500;
    DBMS_OUTPUT.PUT_LINE('ANALYST  : ' || job_arr('ANALYST'));
    DBMS_OUTPUT.PUT_LINE('CLERK    : ' || job_arr('CLERK'));
    DBMS_OUTPUT.PUT_LINE('MANAGER  : ' || job_arr('MANAGER'));
    DBMS_OUTPUT.PUT_LINE('SALESMAN : ' || job_arr('SALESMAN'));
    DBMS_OUTPUT.PUT_LINE('PRESIDENT: ' || job_arr('PRESIDENT'));
END;

ANALYST  : 100
CLERK    : 200
MANAGER  : 300
SALESMAN : 400
PRESIDENT: 500

Array asosiatif dua dimensi

Array asosiatif dua dimensi adalah array asosiatif bersarang. Nilai dari array asosiatif dua dimensi adalah array satu dimensi. Anda dapat menggunakan dua kunci untuk mengaitkan elemen dari array asosiatif paling dalam. Karakteristik dasar array asosiatif dua dimensi sama dengan array asosiatif.

  • Scenarios that are supported by two-dimensional associative arrays
    Ketika hanya array asosiatif satu dimensi yang didukung, Anda dapat menggunakan tabel antara untuk mengimplementasikan fitur array asosiatif dua dimensi, seperti yang ditunjukkan dalam contoh berikut:
    DECLARE
        type TB1 is table of varchar(10) index by varchar(10);
        type TB2 is table of TB1 index by varchar(10);
        v_table1 TB1;
        v_table2 TB2;
    BEGIN
        v_table1('a') := 1;
        v_table1('b') := 2;
        v_table1('c') := 3;
        v_table2('a') := v_table1;
    END;
    Ketika array asosiatif dua dimensi didukung, Anda dapat menggunakan subskrip dua dimensi untuk menetapkan nilai ke elemen dalam v_table2 alih-alih menggunakan tabel antara v_table1, seperti yang ditunjukkan dalam contoh berikut:
    DECLARE
        type TB1 is table of varchar(10) index by varchar(10);
        type TB2 is table of TB1 index by varchar(10);
        v_table2 TB2;
    BEGIN
        v_table2('a')('a') := 1;
        v_table2('a')('b') := 2;
        v_table2('a')('c') := 3;
    END;
  • Examples
    Contoh berikut menunjukkan cara menggunakan array asosiatif dua dimensi:
    -- Contoh array asosiatif dua dimensi 
    DECLARE
        type type_row is table of varchar(10) index by varchar(10);
        type type_table is table of type_row index by varchar(10);
        v_table type_table;
        i varchar2(64);
        i_2 varchar2(64);
    BEGIN
        v_table('a')('b') := 10;
        v_table('a')('c') := 11;
        v_table('z')('b') := 12;
        v_table('z')('c') := 13;
        i := v_table.FIRST;
        WHILE i IS NOT NULL LOOP
            i_2 := v_table(i).FIRST;
            WHILE i_2 IS NOT NULL LOOP
                dbms_output.put_line(i || ' ' || i_2 || '-' || TO_CHAR(v_table(i)(i_2)));
                i_2 := v_table(i).NEXT(i_2);
            END LOOP;
            i := v_table.NEXT(i);
        END LOOP;
    END;
    Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:
    a b-10
    a c-11
    z b-12
    z c-13
  • Collection methods
    Array asosiatif dua dimensi mendukung metode koleksi berikut: COUNT, FIRST, LAST, NEXT, PRIOR, dan EXISTS.
    Anda dapat menggunakan metode berikut untuk memanggil metode koleksi yang tidak mengambil parameter, seperti COUNT:
    array_dim2(n)
    Anda dapat menggunakan metode berikut untuk memanggil metode koleksi yang hanya mengambil satu parameter, seperti NEXT:
    array_dim2(n).op(n)
    Catatan
    • array_dim2: menunjukkan pengenal untuk array asosiatif dua dimensi yang telah dideklarasikan sebelumnya.
    • n: menunjukkan nilai dari tipe data yang ditentukan oleh klausa INDEX BY.
    • op: menunjukkan metode koleksi.
    Kode berikut memberikan contoh tentang cara memanggil metode koleksi dalam array asosiatif dua dimensi:
    DECLARE
        type TB1 is table of varchar(10) index by varchar(10);
        type TB2 is table of TB1 index by varchar(10);
        type TB3 is table of TB2 index by varchar(10);
        v_table TB2;
        v_table3 TB3;
    BEGIN
        v_table('a')('b') := 10;
        v_table('b')('c') := 11;
        v_table('c')('b') := 12;
        v_table('d')('c') := 13;
        v_table3('a') := v_table;
        
        dbms_output.put_line(v_table3('a').COUNT); 
        dbms_output.put_line(v_table3('a').FIRST);
        dbms_output.put_line(v_table3('a').LAST); 
        dbms_output.put_line(v_table3('a').NEXT(v_table3('a').FIRST));
        dbms_output.put_line(v_table3('a').prior(v_table3('a').LAST));
        dbms_output.put_line(v_table3('a').exists(v_table3('a').FIRST));
    END;
    Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:
    4
    a
    d
    b
    c
    t
  • Scenarios that are not supported by two-dimensional associative arrays

    Subskrip dua dimensi hanya didukung dalam array asosiatif dua dimensi tetapi tidak dalam tabel bersarang atau varray.

    Array asosiatif dua dimensi tidak mendukung tipe rekaman, seperti yang ditunjukkan dalam contoh berikut:
    DECLARE
        TYPE emp_typ IS RECORD (
            ename       varchar(10),
            first         varchar(10)
        );
        type TB is table of emp_typ index by varchar(10);
        type TB2 is table of TB index by varchar(10);
        mytable     TB2;
        myrecord    emp_typ;
    BEGIN
        mytable('a')('b') := myrecord;
    END;
    Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:
    ERROR:  Saat ini, hanya array asosiatif tanpa paket dan IS TABLE OF tipe bukan tipe rekaman yang mendukung pencarian dan penugasan subskrip multidimensi
    CONTEXT:  kompilasi fungsi SPL "inline_code_block" dekat baris 11
    Tabel bersarang atau varray tidak dapat berisi array asosiatif dua dimensi, seperti yang ditunjukkan dalam contoh berikut:
    DECLARE
        type TB1 is table of number index by number;
        type TB2 is table of TB1 index by number;
        type TB3 is table of TB2;
        v_table2 TB2;
        v_table3 TB3;
    BEGIN
        v_table2(1)(1) := 1;
        v_table2(1)(2) := 2;
        v_table2(2)(3) := 3;
        v_table2(2)(4) := 4;
    
        v_table3 := TB3(v_table2);
    END;
    Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:
    ERROR:  Nested table dan Varray tidak dapat ditetapkan dengan array asosiatif multidimensi