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.

  • ๐Ÿงบ Definisi: Suatu koleksi memuat banyak elemen dari satu jenis, yang masing-masing diidentifikasi oleh indeks unik.
  • ๐Ÿ“ Varray: Ukuran atas tetap, selalu padat, indeks numerik, harus diinisialisasi sebelum digunakan.
  • ๐Ÿ“š Tabel Bersarang: Tidak ada batasan ukuran, bisa padat atau jarang, disimpan dalam tabel sistem, diperluas dengan EXTEND.
  • ๐Ÿ”‘ Indeks berdasarkan Tabel: Tidak ada batasan ukuran, indeks dapat berupa string atau bilangan bulat negatif, tidak disimpan dalam basis data.
  • ๏ธ Pembangun: Varray dan nested table memerlukan konstruktor eksplisit untuk menginisialisasi sebelum dirujuk.
  • ๏ธ metode: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM, dan DELETE mengelola sebuah koleksi.
  • โšก Jumlah besar: BULK COLLECT mengisi koleksi dalam satu langkah untuk pemrosesan yang cepat.

Oracle Koleksi PL/SQL

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.

Contoh koleksi PL/SQL yang diisi dengan BULK COLLECT.

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
----------------------------------------------

Pertanyaan Umum Demo Slot

Varray memiliki ukuran maksimum tetap dan selalu padat. Tabel bersarang tidak memiliki batasan ukuran, dapat berupa jarang (sparse), dan dapat diperluas, yang membuatnya lebih fleksibel untuk data yang terus bertambah atau data yang tersebar.

Karena ini adalah array asosiatif dalam memori, bukan tabel yang tersimpan. Indeks bertindak sebagai kunci pencarian, sehingga string atau bilangan bulat negatif dapat digunakan, yang berguna untuk pencarian berdasarkan kunci dalam sebuah sesi.

Varray atau tabel bersarang yang belum diinisialisasi secara atomik bernilai null, sehingga merujuk ke elemen tersebut akan menimbulkan kesalahan. Memanggil konstruktor akan mengalokasikannya, setelah itu metode EXTEND dan penugasan dapat menambahkan data.

Ya. Dengan mempertimbangkan apakah ukurannya tetap, apakah data disimpan, dan apakah kunci string diperlukan, AI dapat menunjuk ke Varray, tabel bersarang, atau tabel indeks dan menjelaskan pertimbangan untung ruginya.

BULK COLLECT memuat semua baris ke dalam sebuah koleksi dalam satu kali peralihan konteks antara mesin SQL dan PL/SQL, bukan satu peralihan per baris, yang sangat mengurangi beban pada kumpulan hasil yang besar.

Ringkaslah postingan ini dengan: