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 assoctypeDalam 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
TURNERContoh 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 TURNERContoh 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: 500Array 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 arraysKetika 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:
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_table1 TB1; v_table2 TB2; BEGIN v_table1('a') := 1; v_table1('b') := 2; v_table1('c') := 3; v_table2('a') := v_table1; END;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; - ExamplesContoh berikut menunjukkan cara menggunakan array asosiatif dua dimensi:
Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan:-- 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;a b-10 a c-11 z b-12 z c-13 - Collection methodsArray 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:
Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan: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;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:
Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan: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;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 11Tabel bersarang atau varray tidak dapat berisi array asosiatif dua dimensi, seperti yang ditunjukkan dalam contoh berikut:
Setelah blok anonim sebelumnya dieksekusi, keluaran sampel berikut dihasilkan: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;ERROR: Nested table dan Varray tidak dapat ditetapkan dengan array asosiatif multidimensi