Oracle Koleksi PL/SQL: Varray, Bersarang & Indeks berdasarkan Tabel
Apa itu Koleksi?
Koleksi adalah kelompok elemen bertipe data tertentu yang diurutkan. Koleksi dapat berupa koleksi bertipe data sederhana atau bertipe data kompleks (seperti tipe data yang ditentukan pengguna atau tipe data rekaman).
Dalam kumpulan, setiap elemen diidentifikasi dengan istilah yang disebut โlangganan.โ Setiap item dalam koleksi diberi subskrip unik. Data dalam koleksi tersebut dapat dimanipulasi atau diambil dengan mengacu pada subskrip unik tersebut.
Koleksi adalah hal yang paling berguna ketika data berukuran besar dengan tipe yang sama perlu diproses atau dimanipulasi. Koleksi dapat diisi dan dimanipulasi secara keseluruhan menggunakan opsi 'BULK' di Oracle.
Koleksi diklasifikasikan berdasarkan struktur, subskrip, dan penyimpanan seperti yang ditunjukkan di bawah ini.
- Indeks per tabel (juga dikenal sebagai Associative Array)
- Tabel bersarang
- Varray
Kapan pun, data dalam kumpulan dapat dirujuk dengan tiga istilah Nama Koleksi, Subskrip, Nama Bidang/Kolom sebagai โ ( ). โ. Anda akan mempelajari lebih lanjut tentang kategori koleksi yang disebutkan di atas di bagian bawah.
Varray
Varray adalah metode koleksi yang ukuran arraynya tetap. Ukuran array tidak boleh lebih besar dari nilai tetapnya. Subskrip Varray adalah nilai numerik. Berikut ini adalah atribut Varray.
- Ukuran batas atas ditetapkan
- Diisi secara berurutan dimulai dengan subskrip '1'
- Tipe koleksi ini selalu padat, yaitu kita tidak dapat menghapus elemen array apa pun. Varray dapat dihapus secara keseluruhan, atau dapat dipangkas dari bagian akhir.
- Karena sifatnya yang selalu padat, fleksibilitasnya sangat berkurang.
- Lebih tepat digunakan ketika ukuran array diketahui dan melakukan aktivitas serupa pada semua elemen array.
- Subskrip dan urutannya selalu stabil, yaitu subskrip dan jumlah koleksinya selalu sama.
- Mereka perlu diinisialisasi sebelum menggunakannya dalam program. Operasi apa pun (kecuali operasi EXISTS) pada koleksi yang belum diinisialisasi akan menimbulkan kesalahan.
- Itu dapat dibuat sebagai objek database, yang terlihat di seluruh database atau di dalam subprogram, yang hanya dapat digunakan dalam subprogram tersebut.
Gambar di bawah ini akan menjelaskan alokasi memori Varray (padat) secara diagram.
| 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 sintaksis di atas, type_name dideklarasikan sebagai VARRAY dari tipe 'DATA_TYPE' untuk batas ukuran yang diberikan. Tipe data dapat berupa tipe sederhana atau kompleks.
Tabel Bersarang
Tabel Bersarang adalah kumpulan yang ukuran arraynya tidak tetap. Ini memiliki tipe subskrip numerik. Di bawah ini adalah penjelasan lebih lanjut tentang tipe tabel bersarang.
- Tabel Bersarang tidak memiliki batas ukuran atas.
- Karena batas ukuran atas tidak tetap, koleksi, memori perlu diperluas setiap kali sebelum kita menggunakannya. Kita dapat memperluas koleksinya menggunakan kata kunci 'EXTEND'.
- Diisi secara berurutan dimulai dengan subskrip '1'.
- Jenis koleksi ini bisa keduanya padat dan jarang, yaitu kita dapat membuat koleksi sebagai padat, dan kita juga dapat menghapus elemen array individual secara acak, yang menjadikannya sebagai renggang.
- Ini memberikan lebih banyak fleksibilitas mengenai penghapusan elemen array.
- Itu disimpan dalam tabel database yang dihasilkan sistem dan dapat digunakan dalam kueri pemilihan untuk mengambil nilai.
- Subskrip dan urutannya tidak stabil, yaitu subskrip dan jumlah elemen array dapat bervariasi.
- Mereka perlu diinisialisasi sebelum menggunakannya dalam program. Operasi apa pun (kecuali operasi EXISTS) pada koleksi yang belum diinisialisasi akan menimbulkan kesalahan.
- Itu dapat dibuat sebagai objek database, yang terlihat di seluruh database atau di dalam subprogram, yang hanya dapat digunakan dalam subprogram tersebut.
Gambar di bawah ini akan menjelaskan alokasi memori Tabel Bersarang (padat dan jarang) secara diagram. Ruang elemen berwarna hitam menunjukkan elemen kosong dalam suatu koleksi yaitu 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 <tvpe name> IS TABLE OF <DATA TYPE>;
- Dalam sintaksis di atas, type_name dideklarasikan sebagai kumpulan tabel bersarang dari tipe 'DATA_TYPE'. Tipe data dapat berupa tipe sederhana atau kompleks.
Indeks per tabel
Index-by-table adalah koleksi yang ukuran arraynya tidak tetap. Tidak seperti tipe koleksi lainnya, dalam koleksi index-by-table, subskrip dapat didefinisikan oleh pengguna. Berikut ini adalah atribut index-by-table.
- Subskrip dapat berupa bilangan bulat atau string. Pada saat membuat koleksi, tipe subskrip harus disebutkan.
- Koleksi-koleksi ini tidak disimpan secara berurutan.
- Sifatnya selalu jarang.
- Ukuran array tidak tetap.
- Mereka tidak dapat disimpan di kolom database. Mereka harus dibuat dan digunakan dalam program apa pun dalam sesi tertentu.
- Mereka memberikan lebih banyak fleksibilitas dalam hal mempertahankan subskrip.
- Subskripnya juga bisa berupa urutan subskrip negatif.
- Mereka lebih tepat digunakan untuk nilai kolektif yang relatif lebih kecil dimana koleksinya dapat diinisialisasi dan digunakan dalam subprogram yang sama.
- Mereka tidak perlu diinisialisasi sebelum mulai menggunakannya.
- Itu tidak dapat dibuat sebagai objek database. Itu hanya dapat dibuat di dalam subprogram, yang hanya dapat digunakan dalam subprogram tersebut.
- BULK COLLECT tidak dapat digunakan dalam jenis koleksi ini karena subskrip harus diberikan secara eksplisit untuk setiap catatan dalam koleksi.
Gambar di bawah ini akan menjelaskan alokasi memori Tabel Bersarang (jarang) secara diagram. Ruang elemen berwarna hitam menunjukkan elemen kosong dalam suatu koleksi yaitu jarang.
| Subskrip (varchar) | PERTAMA | KEDUA | KETIGA | KEEMPAT | KELIMA | KEENAM | KETUJUH |
| Nilai (jarang) | Ya | Asd | Af | Asd | Siapa |
Sintaks untuk Indeks per Tabel
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Dalam sintaksis di atas, type_name dideklarasikan sebagai koleksi indeks-per-tabel dari tipe 'DATA_TYPE'. Tipe data dapat berupa tipe sederhana atau kompleks. Variabel subsciprt/index 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 dieksekusi terlebih dahulu setiap kali objek atau koleksi dirujuk untuk pertama kalinya dalam suatu sesi. Berikut adalah detail penting konstruktor dalam konteks koleksi:
- Untuk koleksi, konstruktor ini harus dipanggil secara eksplisit untuk menginisialisasinya.
- Tabel Varray dan Nested perlu diinisialisasi melalui konstruktor ini sebelum dirujuk ke dalam program.
- Konstruktor secara implisit memperluas alokasi memori untuk suatu koleksi (kecuali Varray), sehingga konstruktor juga dapat menetapkan variabel ke koleksi tersebut.
- Menetapkan nilai ke koleksi melalui konstruktor tidak akan membuat koleksi menjadi jarang.
Metode Pengumpulan
Oracle menyediakan banyak fungsi untuk memanipulasi dan bekerja dengan koleksi. Fungsi-fungsi ini sangat berguna dalam program untuk menentukan dan memodifikasi berbagai atribut koleksi. Tabel berikut akan memberikan berbagai fungsi dan deskripsinya.
| metode | Uraian Teknis | SINTAKSIS |
|---|---|---|
| ADA (n) | Metode ini akan mengembalikan hasil Boolean. Ini akan mengembalikan 'TRUE' jika nth elemen ada dalam koleksi itu, jika tidak maka akan mengembalikan FALSE. Hanya fungsi EXISTS yang dapat digunakan dalam koleksi yang tidak diinisialisasi | .EXISTS(elemen_posisi) |
| COUNT | Memberikan jumlah total elemen yang ada dalam koleksi | .MENGHITUNG |
| MEMBATASI | Ini mengembalikan ukuran maksimum koleksi. Untuk Varray, ini akan mengembalikan ukuran tetap yang telah ditentukan. Untuk tabel Bersarang dan Indeks demi tabel, ini memberikan NULL | .MEMBATASI |
| PERTAMA | Mengembalikan nilai variabel indeks pertama (subskrip) dari koleksi | .PERTAMA |
| TERAKHIR | Mengembalikan nilai variabel indeks terakhir (subskrip) dari koleksi | .TERAKHIR |
| SEBELUMNYA (n) | Pengembalian mendahului variabel indeks dalam kumpulan nth elemen. Jika tidak ada nilai indeks sebelumnya, NULL dikembalikan | .PRIOR(n) |
| BERIKUTNYA (n) | Pengembalian berhasil variabel indeks dalam kumpulan nth elemen. Jika tidak ada nilai indeks yang berhasil, NULL dikembalikan | .BERIKUTNYA(n) |
| MEMPERPANJANG | Memperluas satu elemen dalam koleksi di bagian akhir | .MEMPERPANJANG |
| PERPANJANG (n) | Memperluas n elemen di akhir koleksi | .PERPANJANG(n) |
| PERPANJANG (n,i) | Memperluas n salinan ith elemen 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. Membuat koleksinya kosong | .MENGHAPUS |
| HAPUS (n) | Menghapus elemen ke-n dari koleksi. Jika kemudianth elemennya adalah NULL, maka ini tidak akan menghasilkan apa-apa | .HAPUS(n) |
| HAPUS (m,n) | Menghapus elemen dalam rentang mth ke nth dalam koleksi | .HAPUS(m,n) |
Contoh 1: Jenis Catatan pada tingkat Subprogram
Dalam contoh ini, kita akan melihat cara mengisi koleksi menggunakan 'KUMPULKAN SECARA MASSAL' dan bagaimana merujuk pada pengumpulan data.
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;
/
Penjelasan Kode:
- Baris kode 2-8: Jenis rekaman 'emp_det' dideklarasikan dengan kolom emp_no, emp_name, gaji dan pengelola tipe data NUMBER, VARCHAR2, NUMBER, NUMBER.
- Baris kode 9: Membuat koleksi 'emp_det_tbl' dari elemen tipe rekaman 'emp_det'
- Baris kode 10: Mendeklarasikan variabel 'guru99_emp_rec' sebagai tipe 'emp_det_tbl' dan diinisialisasi dengan konstruktor nol.
- Baris kode 12-15: Memasukkan data sampel ke dalam tabel 'emp'.
- Baris kode 16: Melakukan transaksi penyisipan.
- Baris kode 17: Mengambil catatan dari tabel 'emp' dan mengisi variabel koleksi secara massal menggunakan perintah โBULK COLLECTโ. Sekarang variabel 'guru99_emp_rec' berisi semua record yang ada di tabel 'emp'.
- Baris kode 19-26: Mengatur loop 'FOR' untuk mencetak semua record dalam koleksi satu per satu. Metode pengumpulan PERTAMA dan TERAKHIR digunakan sebagai batas bawah dan batas atas lingkaran.
Keluaran: Seperti yang Anda lihat pada gambar di atas ketika 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 ----------------------------------------------

