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;

 

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 dsb. Harga Rp. 24.800,- (157 halaman)

 

Related Articles

 

Comments

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

[…] Data PL/SQL - 3,145 viewsPL/SQL Subprograms - 2,742 viewsMengontrol Akses User - 2,717 viewsCollections dan Records PL/SQL - 2,654 viewsMenampilkan Data - 2,572 viewsPendahuluan - 2,555 […]

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word