Oracle Koleksi PL/SQL: Varray, Bersarang & Indeks berdasarkan Tabel
โก Ringkasan Cerdas
Koleksi PL/SQL adalah kelompok elemen yang terurut dengan tipe data yang sama, masing-masing diakses melalui indeks. Tiga jenis, Varray, tabel bersarang, dan tabel indeks, berbeda dalam hal apakah ukurannya tetap, bagaimana cara kerja indeks, dan apakah dapat disimpan dalam basis data.

Apa itu Koleksi?
Koleksi adalah kelompok elemen yang terurut dari tipe data tertentu. Koleksi dapat berupa tipe data sederhana atau tipe data kompleks seperti tipe data yang ditentukan pengguna atau tipe data record.
Dalam sebuah koleksi, setiap elemen diidentifikasi oleh sebuah istilah yang disebut โlangganan.โ Setiap item diberi indeks unik, dan data dapat dimanipulasi atau diambil dengan merujuk pada indeks unik tersebut.
Koleksi paling berguna ketika sejumlah besar data dengan tipe yang sama perlu diproses atau dimanipulasi. Koleksi dapat diisi dan dimanipulasi secara keseluruhan menggunakan opsi 'BULK' di Oracle.
Koleksi diklasifikasikan berdasarkan struktur, indeks, dan penyimpanan, seperti yang ditunjukkan di bawah ini:
- Tabel indeks (juga dikenal sebagai array asosiatif)
- Tabel bersarang
- Varray
Pada titik mana pun, data dalam sebuah koleksi dapat dirujuk dengan tiga istilah: nama koleksi, indeks, dan nama bidang atau kolom, seperti โ ( ). Anda akan mempelajari tentang kategori koleksi ini di bagian-bagian di bawah ini.
Sekilas tentang Jenis-Jenis Koleksi
Ketiga jenis koleksi tersebut memiliki kelebihan dan kekurangan yang berbeda. Tabel di bawah ini membandingkan ketiganya sebelum masing-masing dibahas secara detail.
| Aspek | Varray | Tabel Bersarang | Indeks berdasarkan Tabel |
|---|---|---|---|
| Ukuran | Batas atas tetap | Tidak ada batas | Tidak ada batas |
| tanda tangan | Numeric | Numeric | Bilangan bulat atau string |
| Kepadatan | Selalu padat | Padat atau jarang | Selalu jarang |
| Tersimpan dalam basis data | Ya | Ya | Tidak |
| Membutuhkan inisialisasi | Ya | Ya | Tidak |
Varray
Varray adalah koleksi yang ukuran array-nya tetap dan tidak dapat dilampaui. Indeks Varray adalah nilai numerik. Atribut Varray adalah:
- Ukuran batas atasnya tetap.
- Diisi secara berurutan dimulai dengan indeks '1'.
- Tipe koleksi ini selalu padat; kita tidak dapat menghapus elemen array satu per satu. Varray dapat dihapus secara keseluruhan atau dipangkas dari bagian akhir.
- Karena selalu padat, maka fleksibilitasnya sangat terbatas.
- Hal ini lebih tepat jika ukuran array diketahui dan aktivitas serupa dilakukan pada semua elemen.
- Indeks dan jumlah koleksi selalu tetap stabil.
- Koleksi tersebut harus diinisialisasi sebelum digunakan. Setiap operasi selain EXISTS pada koleksi yang belum diinisialisasi akan menimbulkan kesalahan.
- Objek tersebut dapat dibuat sebagai objek basis data yang terlihat di seluruh basis data, atau di dalam subprogram untuk digunakan hanya di sana.
Gambar di bawah ini menjelaskan alokasi memori dari Varray (dense).
| tanda tangan | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Nilai | Xyz | Dfv | dari | Cxs | vbc | tidak | Ya |
Sintaks untuk VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- Dalam sintaks di atas, type_name dideklarasikan sebagai VARRAY dengan tipe 'DATA_TYPE' untuk batas ukuran yang diberikan. Tipe data dapat berupa tipe sederhana atau kompleks.
Tabel Bersarang
Tabel bersarang adalah koleksi di mana ukuran larik tidak tetap. Ia memiliki tipe indeks numerik. Lebih lanjut tentang tipe tabel bersarang:
- Tabel bersarang tidak memiliki batasan ukuran atas.
- Karena batas atasnya tidak tetap, memori perlu diperluas setiap kali sebelum digunakan, menggunakan kata kunci 'EXTEND'.
- Diisi secara berurutan dimulai dengan indeks '1'.
- Jenis koleksi ini bisa berupa keduanya. padat dan jarang; kita dapat membuatnya padat dan juga menghapus elemen individual secara acak, yang membuatnya jarang.
- Ini memberikan fleksibilitas lebih untuk menghapus elemen array.
- Data tersebut tersimpan dalam tabel basis data yang dihasilkan oleh sistem dan dapat digunakan dalam kueri select untuk mengambil nilai.
- Angka indeks dan jumlahnya dapat bervariasi.
- Koleksi tersebut harus diinisialisasi sebelum digunakan. Setiap operasi selain EXISTS pada koleksi yang belum diinisialisasi akan menimbulkan kesalahan.
- Objek tersebut dapat dibuat sebagai objek basis data yang terlihat di seluruh basis data, atau di dalam subprogram untuk digunakan hanya di sana.
Gambar di bawah ini menjelaskan alokasi memori dari tabel bersarang (padat dan jarang). Ruang elemen kosong menunjukkan elemen jarang.
| tanda tangan | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Nilai (padat) | Xyz | Dfv | dari | Cxs | vbc | tidak | Ya |
| Nilai (jarang) | Ya | Asd | Af | Asd | Siapa |
Sintaks untuk Tabel Bersarang:
TYPE <type_name> IS TABLE OF <DATA_TYPE>;
- Dalam sintaks di atas, type_name dideklarasikan sebagai koleksi tabel bersarang dengan tipe 'DATA_TYPE'. Tipe data dapat berupa tipe sederhana atau kompleks.
Indeks berdasarkan Tabel
Tabel indeks adalah koleksi di mana ukuran larik tidak tetap. Tidak seperti tipe koleksi lainnya, indeks tabel indeks dapat ditentukan oleh pengguna. Atribut tabel indeks adalah:
- Indeks dapat berupa bilangan bulat atau string. Tipe indeks harus disebutkan saat membuat koleksi.
- Koleksi-koleksi ini tidak disimpan secara berurutan.
- Sifatnya selalu jarang.
- Ukuran array tidak tetap.
- Data tersebut tidak dapat disimpan dalam kolom basis data. Data tersebut dibuat dan digunakan dalam sesi tertentu.
- Hal itu memberikan fleksibilitas lebih dalam mempertahankan indeks bawah.
- Indeks bawahnya bisa berupa urutan negatif.
- Metode ini lebih tepat untuk nilai koleksi yang relatif lebih kecil yang digunakan dalam subprogram yang sama.
- Tidak perlu diinisialisasi sebelum digunakan.
- Objek-objek tersebut tidak dapat dibuat sebagai objek basis data; objek-objek tersebut hanya dibuat di dalam subprogram.
- BULK COLLECT tidak dapat digunakan dengan tipe koleksi ini, karena indeks harus diberikan secara eksplisit untuk setiap record.
Gambar di bawah ini menjelaskan alokasi memori dari tabel indeks-by (sparse). Ruang elemen kosong menunjukkan elemen sparse.
| Subskrip (varchar) | PERTAMA | KEDUA | KETIGA | KEEMPAT | KELIMA | KEENAM | KETUJUH |
| Nilai (jarang) | Ya | Asd | Af | Asd | Siapa |
Sintaks untuk Tabel Indeks-berdasarkan:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Dalam sintaks di atas, type_name dideklarasikan sebagai koleksi tabel indeks dengan tipe 'DATA_TYPE'. Variabel indeks diberikan sebagai tipe VARCHAR2 dengan ukuran maksimum 10.
Konsep Konstruktor dan Inisialisasi dalam Koleksi
Konstruktor adalah fungsi bawaan yang disediakan oleh Oracle yang memiliki nama yang sama dengan objek atau koleksi. Konstruktor ini dieksekusi pertama kali setiap kali objek atau koleksi dirujuk untuk pertama kalinya dalam sebuah sesi. Detail penting dari sebuah konstruktor dalam konteks koleksi:
- Untuk koleksi, konstruktor ini harus dipanggil secara eksplisit untuk menginisialisasi koleksi.
- Baik Varray maupun tabel bersarang perlu diinisialisasi melalui konstruktor ini sebelum dirujuk dalam program.
- Konstruktor secara implisit memperluas alokasi memori untuk sebuah koleksi (kecuali Varray), sehingga konstruktor juga dapat menetapkan variabel ke koleksi tersebut.
- Memberikan nilai melalui konstruktor tidak akan pernah membuat koleksi menjadi jarang (sparse).
Metode Pengumpulan
Oracle menyediakan banyak fungsi untuk memanipulasi dan bekerja dengan koleksi. Fungsi-fungsi ini menentukan dan memodifikasi berbagai atribut dari sebuah koleksi. Tabel di bawah ini memberikan berbagai fungsi dan deskripsinya.
| metode | Deskripsi | Sintaksis |
|---|---|---|
| ADA (n) | Mengembalikan hasil Boolean. Mengembalikan TRUE jika elemen ke-n ada, jika tidak FALSE. Hanya EXISTS yang dapat digunakan pada koleksi yang belum diinisialisasi. | .EXISTS(elemen_posisi) |
| COUNT | Menampilkan jumlah total elemen yang ada dalam sebuah koleksi. | .MENGHITUNG |
| MEMBATASI | Mengembalikan ukuran maksimum koleksi. Untuk Varray, mengembalikan ukuran tetap; untuk tabel bersarang dan tabel berbasis indeks, mengembalikan NULL. | .MEMBATASI |
| PERTAMA | Mengembalikan nilai indeks pertama dari koleksi tersebut. | .PERTAMA |
| TERAKHIR | Mengembalikan nilai indeks terakhir dari koleksi. | .TERAKHIR |
| SEBELUMNYA (n) | Mengembalikan indeks sebelumnya dari elemen ke-n. Jika tidak ada, NULL akan dikembalikan. | .PRIOR(n) |
| BERIKUTNYA (n) | Mengembalikan indeks berikutnya dari elemen ke-n. Jika tidak ada, NULL akan dikembalikan. | .BERIKUTNYA(n) |
| MEMPERPANJANG | Memperpanjang satu elemen di akhir koleksi. | .MEMPERPANJANG |
| PERPANJANG (n) | Memperluas n elemen di akhir koleksi. | .PERPANJANG(n) |
| PERPANJANG (n,i) | Memperluas n salinan elemen ke-i di akhir koleksi. | .PERPANJANG(n,i) |
| TRIM | Menghapus satu elemen dari akhir koleksi. | .MEMANGKAS |
| PANGKAS (n) | Menghapus n elemen dari akhir koleksi. | .TRIM (n) |
| DELETE | Menghapus semua elemen dari koleksi, sehingga koleksi menjadi kosong. | .MENGHAPUS |
| HAPUS (n) | Menghapus elemen ke-n. Jika elemen ke-n adalah NULL, tidak melakukan apa pun. | .HAPUS(n) |
| HAPUS (m,n) | Menghapus elemen-elemen dalam rentang mth hingga nth dalam koleksi. | .HAPUS(m,n) |
Contoh 1: Tipe Rekaman pada Tingkat Subprogram
Dalam contoh ini, kita akan melihat cara mengisi koleksi menggunakan 'KUMPULKAN SECARA MASSAL'dan bagaimana cara merujuk pada data koleksi tersebut.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); BEGIN INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000); INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000); INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000); COMMIT; SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec FROM emp; dbms_output.put_line ('Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name); dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary); dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager); dbms_output.put_line('--------------------------------'); END LOOP; END; /
Code Penjelasan
- Code baris 2-8: Jenis rekaman 'emp_det' dideklarasikan dengan kolom emp_no, emp_name, manager, dan salary dengan tipe data NUMBER, VARCHAR2, NUMBER, dan NUMBER.
- Code baris 9: Membuat koleksi 'emp_det_tbl' dari elemen tipe record 'emp_det'.
- Code baris 10: Mendeklarasikan variabel 'guru99_emp_rec' sebagai tipe 'emp_det_tbl' dan menginisialisasinya dengan konstruktor null.
- Code baris 12-15: Memasukkan data sampel ke dalam tabel 'emp'.
- Code baris 16: Melakukan transaksi penyisipan.
- Code baris 17: Mengambil data dari tabel 'emp' dan mengisi variabel koleksi secara massal menggunakan โBULK COLLECTโ. Variabel 'guru99_emp_rec' sekarang berisi semua data yang ada di tabel 'emp'.
- Code baris 19-26: Mengatur perulangan 'FOR' untuk mencetak semua catatan dalam koleksi satu per satu. Metode koleksi FIRST dan LAST digunakan sebagai batas bawah dan atas. lingkaran.
Keluaran: Saat kode di atas dijalankan, Anda akan mendapatkan output berikut.
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------

