Collections dan Records PL/SQL
5.3. Mendefinisikan Tipe-tipe Collection
Untuk menciptakan collections, kita mendefinisikan tipe collection, kemudian mendeklarasikan variables dari tipe tersebut. Kita dapat mendefinisikan tipe-tipe TABLE dan VARRAY di dalam bagian declarative pada sebuah blok PL/SQL, subprogram, atau package.
Collections mengikuti aturan-aturan scoping dan instantiation seperti tipe-tipe dan variable-variable lain. Dalam sebuah blok atau subprogram, collections dibentuk ketika kita masuk ke blok atau subprogram dan berhenti tampil ketika kita keluar. Dalam package, collections ada ketika kita pertama kali mereferensi package dan berhenti ada ketika kita mengakhiri session database.
Nested Tables
Untuk nested tables, kita gunakan sintaks
TYPE type_name IS TABLE OF element_type [NOT NULL];
type_name adalah penentu tipe yang digunakan sebelumnya untuk mendeklarasikan collections. Untuk nested tables yang dideklarasikan bersama PL/SQL, element_type merupakan beberapa tipe data PL/SQL, kecuali:
REF CURSOR
Nested tables yang dideklarasikan secara global di dalam SQL memiliki batasan-batasan pada tipe-tipe elemennya. Mereka tidak dapat menggunakan tipe-tipe elemen berikut ini:
BINARY_INTEGER, PLS_INTEGER BOOLEAN LONG, LONG RAW NATURAL, NATURALN POSITIVE, POSITIVEN REF CURSOR SIGNTYPE STRING
Varrays
Untuk varrays, gunakan sintaks:
TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit)
OF element_type [NOT NULL];
Arti dari type_name dan element_type adalah sama seperti untuk nested tables.
size_limit merupakan literal integer positif yang merepresentasikan jumlah maksimum elemen dalam array. Ketika mendefinisikan tipe VARRAY, kita harus menentukan nilai maksimumnya. Dalam contoh berikut ini, kita mendefinisikan tipe yang dapat menampung hingga 366 tanggal:
DECLARE TYPE Calendar IS VARRAY(366) OF DATE;
Associative Arrays
Untuk associative arrays (dikenal juga dengan index-by tables), gunakan sintaks:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size_limit)]; INDEX BY key_type;
Sebuah key_type dapat berupa numerik, baik BINARY_INTEGER atau PLS_INTEGER. Ia dapat juga berupa VARCHAR2 atau salah satu dari subtipe-nya VARCHAR, STRING, atau LONG. Kita harus menentukan panjang dari keys berbasis VARCHAR2, kecuali LONG dimana ekuivalen dengan jika kita mendeklarasikan tipe key dari VARCHAR2(32760). Tipe-tipe RAW, LONG RAW, ROWID, CHAR, dan CHARACTER tidak diperbolehkan sebagai keys untuk sebuah associative array.
Klausa inisialisasi tidak diperlukan (atau diperbolehkan).
Ketika kita mereferensi elemen dari associative array yang menggunakan key berbasis VARCHAR2, kita dapat menggunakan tipe-tipe lain, seperti DATE atau TIMESTAMP, sejauh mereka dapat dikonversi ke VARCHAR2 dengan function TO_CHAR.
Index-by tables dapat menyimpan data menggunakan nilai primary key sebagai index, dimana nilai-nilai key tidak sekuensial (terurut). Dalam contoh di bawah ini, kita menyimpan record tunggal di dalam index-by table, dan subscript-nya adalah 7468, bukannya 1.
DECLARE TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; emp_tab EmpTabTyp; BEGIN /* Retrieve employee record. */ SELECT * INTO emp_tab(7468) FROM emp WHERE empno = 7468; END;
5.3.1. Mendefinisikan Tipe-tipe SQL yang Ekuivalen dengan Tipe-tipe Collection PL/SQL
Untuk menyimpan nested tables dan varrays di dalam table-table database, kita juga harus mendeklarasikan tipe-tipe SQL menggunakan perintah CREATE TYPE. Tipe-tipe SQL dapat digunakan sebagai kolom-kolom atau atribut-atribut dari tipe-tipe objek SQL.
Kita dapat mendeklarasikan tipe-tipe yang ekuivalen di dalam PL/SQL, atau menggunakan nama tipe SQL di dalam deklarasi variable PL/SQL.
Contoh Nested Table
Script SQL*Plus berikut ini menunjukkan bagaimana kita mungkin mendeklarasikan nested table di dalam SQL, dan menggunakannya sebagai atribut dari tipe objek:
CREATE TYPE CourseList AS TABLE OF VARCHAR2(10) -- define type / CREATE TYPE Student AS OBJECT ( -- create object id_num INTEGER(4), name VARCHAR2(25), address VARCHAR2(35), status CHAR(2), courses CourseList) -- declare nested table as attribute /
Indentifier courses merepresentasikan seluruh nested tables. Setiap elemen dari courses akan menyimpan code name dari college course seperti ‘Math 1020′.
Contoh Varray
Script di bawah ini menciptakan kolom database yang menyimpan varrays. Setiap elemen varray mengandung sebuah VARCHAR2.
-- Each project has a 16-character code name. -- We will store up to 50 projects at a time in a database column. CREATE TYPE ProjectList AS VARRAY(50) OF VARCHAR2(16); / CREATE TABLE department ( -- create database table dept_id NUMBER(2), name VARCHAR2(15), budget NUMBER(11,2), -- Each department can have up to 50 projects. projects ProjectList) /
5.4. Mendeklarasikan Variable-variable Collection PL/SQL
Sekali kita mendefinisikan tipe collection, kita dapat mendeklarasikan variable dari tipe tersebut. Kita menggunakan nama tipe baru di dalam deklarasi, sama dengan tipe-tipe predefined seperti NUMBER dan INTEGER.
Contoh: Mendeklarasikan Nested Tables, Varrays, dan Associative Arrays
DECLARE TYPE nested_type IS TABLE OF VARCHAR2(20); TYPE varray_type IS VARRAY(50) OF INTEGER; TYPE associative_array_type IS TABLE OF NUMBER INDEXED BY BINARY_INTEGER; v1 nested_type; v2 varray_type; v3 associative_array_type;
Contoh %TYPE
Kita dapat menggunakan %TYPE untuk menentukan tipe data dari collection yang telah didefinisikan sebelumnya, sehingga perubahan definisi dari collection secara otomatis akan mengubah variable-variable lain yang bergantung kepada jumlah elemen-elemen atau tipe elemen:
DECLARE TYPE Platoon IS VARRAY(20) OF Soldier; p1 Platoon; -- Jika kita mengubah jumlah soldiers di dalam platoon, p2 akan -- merefleksikan perubahan tersebut ketika blok ini di-recompile. p2 p1%TYPE;
Contoh: Mendeklarasikan Parameter Procedure sebagai Nested Table
Kita dapat mendefinisikan collection-collection sebagai parameter-parameter formal dari functions dan procedures. Dengan cara itu, ktia dapat melewatkan collection-collection ke stored subprograms dan dari satu subprogram ke lainnya. Contoh berikut ini mendeklarasikan nested table sebagai parameter dari procedure ter-package:
CREATE PACKAGE personnel AS TYPE Staff IS TABLE OF Employee; ... PROCEDURE award_bonuses (members IN Staff); END personnel;
Untuk memanggil PERSONEL.AWARD_BONUSES dari luar package, kita mendeklarasikan variable dari tipe PERSONEL.STAFF dan melewatkan variable tersebut sebagai parameter.
Kita dapat juga menentukan tipe collection di dalam klausa RETURN dari spesifikasi function:
DECLARE TYPE SalesForce IS VARRAY(25) OF Salesperson; FUNCTION top_performers (n INTEGER) RETURN SalesForce IS ...
Contoh: Menentukan Tipe-tipe Elemen Collection dengan %TYPE dan %ROWTYPE
Untuk menentukan tipe elemen, kita menggunakan %TYPE, yang menyediakan tipe data dari variable atau kolom pada database. Juga, kita dapat menggunakan %ROWTYPE, yang menyediakan tipe baris data dari cursor atau table pada database. Dua contohnya adalah sebagai berikut:
DECLARE TYPE EmpList IS TABLE OF emp.ename%TYPE; -- berdasar pada column CURSOR c1 IS SELECT * FROM dept; TYPE DeptFile IS VARRAY(20) OF c1%ROWTYPE; -- berdasar pada cursor
Contoh: VARRAY dari Records
Dalam contoh berikut ini, kita menggunakan tipe RECORD untuk menentukan tipe elemen:
DECLARE TYPE AnEntry IS RECORD ( term VARCHAR2(20), meaning VARCHAR2(200)); TYPE Glossary IS VARRAY(250) OF AnEntry;
Contoh: Constraint NOT NULL pada Elemen-elemen Collection
Kita dapat juga memaksakan constraint NOT NULL pada tipe elemen:
DECLARE TYPE EmpList IS TABLE OF emp.empno%TYPE NOT NULL;
| 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 dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Silahkan melanjutkan membaca pembahasan Collections dan Records PL/SQL […]