Collections dan Records PL/SQL
Banyak teknik-teknik pemrograman yang menggunakan tipe-tipe collection seperti array, bag, list, set, dan tree. Untuk mendukung teknik-teknik ini di dalam aplikasi-aplikasi database, PL/SQL menyediakan tipe-tipe data TABLE dan VARRAY, yang mengijinkan kita untuk mendeklarasikan index-by tables, nested tables dan variable-size arrays. Dalam pembahasan kali ini, kita akan mempelajari bagaimana tipe-tipe tersebut mengijinkan kita untuk mereferensi dan memanipulasi kumpulan data sebagai objek-objek secara keseluruhan. Kita juga mempelajari bagaimana tipe data RECORD mengijinkan kita untuk memperlakukan data berhubungan namun tidak serupa sebagai unit logikal.
Pembahasan kali ini mencakup topik-topik sebagai berikut:
- Apa itu Collection?
- Memilih Tipe Collection PL/SQL untuk Digunakan
- Mendefinisikan Tipe Collection
- Mendeklarasikan Variable-variable Collection PL/SQL
- Menginisialisasi dan Mereferensi Collections
- Memberikan Nilai Collections
- Menggunakan Collections PL/SQL bersama Perintah-perintah SQL
- Menggunakan Metode-metode Collection
- Menghindari Exception-exception Collection
- Menekan Overhead Perulangan untuk Collection dengan Bulk Binds
- Apa itu Records?
- Mendefinisikan dan Mendeklarasikan Records
- Menginisialisasi Records
- Memberikan Nilai Records
- Memanipulasi Records
5.1. Apa itu Collection?
Sebuah collection adalah kelompok elemen-elemen terurut, yang memiliki tipe data sama. Ia merupakan konsep umum yang mencakup list, array dan tipe-tipe data lain sudah lazim. Setiap elemen memiliki subscript unik yang menentukan posisinya dalam collection.
PL/SQL menawarkan tipe-tipe collection berikut ini:
- Index-by tables, juga dikenal sebagai associative arrays, mengijinkan kita mencari elemen-elemen menggunakan angka-angka dan string-string yang berubah-ubah untuk nilai subscript-nya. (Mereka mirip dengan hash table pada bahasa-bahasa pemrograman lain).
- Nested tables menyimpan angka yang berubah-ubah dari elemen-elemen. Mereka menggunakan angka-angka terurut sebagai subscript-subscriptnya. Kita dapat mendefinisikan tipe-tipe SQL yang ekuivalen, mengijinkan nested tables untuk disimpan di dalam table-table dalam database dan dimanipulasi melalui SQL.
- Varrays (kependekan dari variable-size arrays) menyimpan jumlah yang tetap dari elemen-elemen (meskipun kita dapat mengubah jumlah elemen-elemen saat runtime). Mereka menggunakan angka-angka urut sebagai subscript-subscript. Kita dapat mendefinisikan tipe-tipe SQL yang ekuivalen, dan mengijinkan varrays untuk disimpan pada table-table dalam database. Mereka dapat disimpan dan ditampilkan melalui SQL, namun kurang fleksibel dibandingkan dengan nested tables.
Meskipun collections hanya dapat memiliki satu dimensi, kita dapat memodelkan arrays multi-dimensi dengan menciptakan collections yang elemen-elemennya juga merupakan collections.
Untuk menggunakan collections dalam aplikasi, kita mendefinisikan satu atau lebih type-type PL/SQL, kemudian mendefinisikan variable-variable dari type-type tersebut. Kita dapat mendefinisikan collection dari type-type dalam procedure, function, atau package. Kita dapat melewatkan collection dari variable-variable sebagai parameter-parameter, untuk memindahkan data diantara aplikasi-aplikasi client-side dan sub-sub program.
Untuk mencari data yang lebih kompeks dari nilai-nilai tunggal, kita dapat menyimpan record-record PL/SQL atau object-object type SQL dalam collections. Nested tables dan varrays dapat juga menjadi atribut dari object-object type;
5.1.1. Memahami Nested Tables
Bersama dengan database, nested tables dapat dianggap table pada database dengan hanya satu kolom. Oracle menyimpan baris-baris data dari nested table dalam urutan-urutan tidak khusus. Namun, ketika kita menampilkan nested table ke dalam PL/SQL variable, baris-baris data diberikan subscript-subscript berurutan mulai dari 1. Hal ini memberikan kepada kita sebuah akses yang mirip array terhadap baris-baris data tunggal.
PL/SQL nested tables seperti array-array satu-dimensi. Kita dapat memodelkan array-array multi-dimensi dengan menciptakan nested tables yang elemen-elemennya juga berupa nested tables.
Nested tables berbeda dengan arrays dalam dua hal penting:
- Arrays memiliki batas atas yang tetap, namun nested tables tidak memiliki batas atas (lihat Gambar 5-1). Sehingga, ukuran nested table dapat bertambah secara dinamis.
- Arrays harus padat (memiliki subsrcipt-subscript urut). Sehingga, kita tidak dapat menghapus elemen-elemen di dalamnya.. Pada awalnya, nested tables juga padat, namun mereka dapat menjadi tipis (memiliki subsrcipt-subscript tidak urut). Sehingga, kita dapat menghapus elemen-elemen dari nested table menggunakan built-in procedure DELETE. Hal ini mungkin akan meninggalkan celah dalam index, namun built-in function NEXT mengijinkan kita untuk melakukan iterasi melalui serangkaian subscript-subscript.
Gambar 5-1 Arrays versus Nested Tables
5.1.2. Memahami Varrays
Item-item dengan tipe VARRAY disebut varrays. Mereka mengijinkan kita untuk menghubungkan identifier tunggal dengan seluruh collection. Hubungan ini mengijinkan kita untuk memanipulasi collection sebagai sebuah kesatuan dan mereferensi elemen-elemen tunggal secara mudah. Untuk mereferensi elemen, kita menggunakan sintaks standard subscripting (lihat Gambar 5-2). Sebagai contoh, Grade(3) mereferensi elemen ketiga dari varrays Grades.

Gambar 5-2 Varray berukuran 10
Varray memiliki ukuran maksimum, yang harus kita tentukan dalam definisi tipenya. Index-nya memiliki batas bawah bernilai 1 yang tetap dan batas atas yang dapat memanjang. Sebagai contoh, batas atas varray Grades adalah 7, namun kita dapat memperpanjangnya menjadi 8, 9, 10 dan seterusnya. Sehingga, varray dapat mengandung jumlah elemen yang bervariasi, dari nol (ketika masih kosong) hingga maksimum sebesar yang telah ditentukan dalam definisi tipenya.
5.1.3. Memahami Associative Arrays (Index-By Tables)
Associative arrays merupakan kumpulan key-value berpasang-pasangan, yang mana setiap key adalah unik dan digunakan untuk mencari nilai yang terkait di dalam array. Key dapat berupa integer atau string.
Memberikan nilai menggunakan key untuk pertama kali menambahkan key tersebut kepada array terkait. Pemberian-pemberian nilai selanjutnya menggunakan key yang sama akan meng-update entry yang sama. Penting untuk memiliki key yang bernilai unik, baik dengan menggunakan primary key dari SQL table, atau dengan menggabungkan string-string secara bersama-sama untuk membentuk nilai unik.
Sebagai contoh, berikut ini adalah deklarasi dari tipe associative array, dan dua arrays dengan tipe tersebut, menggunakan key-key berupa string-string:
DECLARE
TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
country_population population_type;
continent_population population_type;
howmany NUMBER;
which VARCHAR2(64)
BEGIN
country_population('Greenland') := 100000;
country_population('Iceland') := 750000;
howmany := country_population('Greenland');
continent_population('Australia') := 30000000;
continent_population('Antarctica') := 1000; -- Creates new entry
continent_population('Antarctica') := 1001; -- Replaces previous
value
which := continent_population.FIRST; -- Returns 'Antarctica'
-- as that comes first alphabetically.
which := continent_population.LAST; -- Returns 'Australia'
howmany := continent_population(continent_population.LAST);
-- Returns the value corresponding to the last key, in this
-- case the population of Australia.
END;
/
Associative arrays membantu kit merepresentasikan kumpulan data dengan ukuran yang berubah-ubah, dengan pencarian cepat untuk elemen-elemen tunggal tanpa perlu mengetahui posisinya di dalam array dan tanpa harus mencari melalui seluruh elemen-elemen array. Hal ini seperti versi sederhana dari SQL table dimana kita dapat menampilkan nilai-nilai berdasarkan primary key. Untuk pencarian data dengan penyimpanan sementara secara sederhana, associative array mengijinkan kita untuk menghindari penggunaan space dan network operation yang dibutuhkan oleh SQL tables.
Karena associative arrays dimaksudkan untuk data sementara dibandingkan menyimpan data secara tetap, kita tidak dapat menggunakannya dengan perintah-perintah SQL seperti INSERT dan SELECT INTO. Kita dapat membuatnya persistent selama satu database session dengan mendeklarasikan tipe dalam package dan memberikan nilai-nilai dalam package body.
5.1.4. Bagaimana Globalization Settings Mempengaruhi Kunci-kunci VARCHAR2 untuk Associative Arrays
Jika pengaturan untuk national language atau globalization berubah selama session yang menggunakan associative arrays dengan nilai-nilai key VARCHAR2, program mungkin akan mengalami runtime error. Sebagai contoh, mengubah initialization paramters NLS_COMP atau NLS_SORT bersama dalam session mungkin menyebabkan method-metod seperti NEXT dan PRIOR untuk memunculkan exceptions. Jika kita perlu mengubah setting-setting ini selama session tertentu, yakinkan untuk mengaturnya kembali ke nilai-nilai asalnya sebelum melakukan operasi-operasi selanjutnya dengan bentuk-bentuk associative arrays seperti ini.
Ketika kita mendeklarasikan associative array menggunakan string sebagai key, deklarasi harus menggunakan tipe VARCHAR2, STRING, atau LONG. Kita dapat menggunakan tipe berbeda, seperti NCHAR atau NVARCHAR2, sebagai kunci untuk mereferensi associative array. Kita bahkan dapat menggunakan tipe seperti DATE, sepanjang ia dapat dikonversi ke VARCHAR2 dengan function TO_CHAR.
Namun, kita harus berhati-hati ketika menggunakan tipe-tipe lain dimana nilai-nilai yang digunakannya sebagai key adalah konsisten dan unik. Sebagai contoh, nilai string SYSDATE mungkin berubah jika initialization parameter NLS_DATE_FORMAT berubah, sehingga array_element(SYSDATE) tidak akan menghasilkan hasil yang sama seperti sebelumnya. Dua nilai NVARCHAR2 yang berbeda dapat diubah ke nilai VARCHAR2 yang sama (berisi tanda tanya kecuali karakter-karakter national tertentu). Dalam kasus ini, array_element(national_string1) dan array_element(national_string2) mungkin akan mengacu kepada elemen yang sama.
Ketika kita melewatkan associative array sebagai parameter ke remote database dengan menggunakan database link, kedua database dapat memiliki globalization settings yang berbeda. Ketika remote database melakukan operasi-operasi seperti FIRST dan NEXT, ia menggunakan urutan karakternya sendiri bahkan jika terdapat bentuk yang berbeda dari urutan dimana collection berasal. Jika perbedaan-perbedaan character set berarti bahwa dua key yang unik adalah tidak unik pada remote database, program akan mendapati exception VALUE_ERROR.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12
| Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi. Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb. |



































