Collections dan Records PL/SQL

5.5. Menginisialisasi dan Mereferensi Collections

Sampai kita menginisialisasinya, nested table atau varray secara atomic adalah null: collection itu sendiri adalah null, bukan elemen-elemennya. Untuk menginisialisasi nested table atau varray, kita menggunakan constructor, sebuah function system-defined dengan nama yang sama seperti tipe collection. Function ini “membangun” collections dari elemen-elemen yang dilewatkan kepadanya.

Kita harus secara eksplisit memanggil constructor untuk setiap varray dan variable nested table. (Associative arrays, bentuk ketiga dari collection, tidak menggunakan constructors). Pemanggilan constructor diperbolehkan dimanapun pemanggilan function diperbolehkan.

Contoh: Constructor untuk Nested Table

Dalam contoh berikut ini, kita melewatkan banyak elemen-elemen ke constructor CounterList(), yang mengembalikan nested table yang mengandung elemen-elemen tersebut:

DECLARE
  TYPE CourseList IS TABLE OF VARCHAR2(16);
  my_courses CourseList;
BEGIN
  my_courses :=
  CourseList('Econ 2010', 'Acct 3401', 'Mgmt 3100');
END;

Dikarenakan nested table tidak memiliki ukuran maksimum yang dideklarasikan, kita dapat meletakkan elemen-elemen di dalam constructor sebanyak yang dibutuhkan.

Contoh: Constructor untuk Varray

Dalam contoh berikutnya, kita melewatkan tiga objek ke constructor ProjectList(), yang menghasilkan varray berisi objek-objek tersebut.

DECLARE
  TYPE ProjectList IS VARRAY(50) OF VARCHAR2(16);
  accounting_projects ProjectList;
BEGIN
  accounting_projects :=
  ProjectList('Expense Report, 'Outsourcing', 'Auditing);
END;

Kita tidak perlu menginisialisasi seluruh varray. Sebagai contoh, jika varray memiliki ukuran maksimum 50, kita dapat melewatkan kurang dari 50 elemen kepada constructor-nya.

Contoh: Collection Constructor Termasuk Elemen-elemen null

Kecuali kita menentukan constraint NOT NULL, kita dapat melewatkan elemen-elemen null ke constructor. Contohnya adalah sebagai berikut:

BEGIN
my_courses := CourseList('Math 3010', NULL, 'Stat 3202');

Contoh: Mengkombinasikan Deklarasi Collection dan Constructor

Kita dapat menginisialisasi collection di dalam deklarasinya, yang mana merupakan praktek pemrograman yang baik:

DECLARE
  TYPE CourseList IS TABLE OF VARCHAR2(16);
  my_courses CourseList :=
  CourseList('Art 1111', 'Hist 3100', 'Engl 2005');

Contoh: Constructor Varray Kosong

Jika kita memanggil constructor tanpa argumen-argumen, kita akan mendapatkan collection kosong namun tidak null:

DECLARE
  TYPE Clientele IS VARRAY(100) OF Customer;
  vips Clientele := Clientele(); -- initialize empty varray
BEGIN
  IF vips IS NOT NULL THEN -- condition yields TRUE
    ...
  END IF;
END;

Dalam kasus ini, kita dapat memanggil method EXTEND dari collection untuk menambahkan elemen-elemen kemudian.

Contoh: Constructor Nested Table Dalam Perintah SQL

Dalam contoh kali ini, kita menambahkan beberapa nilai-nilai scalar dan nested table CourseList ke dalam table SOPHOMORES.

BEGIN
INSERT INTO sophomores
VALUES (5035, 'Janet Alvarez', '122 Broad St', 'FT',CourseList('Econ 2010', 'Acct 3401', 'Mgmt 3100'));

Contoh: Constructor Varray Dalam Perintah SQL

Dalam contoh berikut ini, kita menambahkan data ke dalam table DEPARTMENT. Constructor varray ProjectList() menyediakan nilai untuk kolom PROJECTS.

BEGIN
  INSERT INTO department
  VALUES(60, 'Security', 750400,
  ProjectList('New Badges', 'Track Computers', 'Check Exits'));

5.5.1. Mereferensi Elemen-elemen Collection

Setiap referensi ke elemen mengandung nama collection dan subscript dalam tanda kurung. Subscript menentukan elemen mana yang diproses. Untuk mereferensi elemen, kita menentukan subscript-nya menggunakan sintaks:

collection_name(subscript)

dimana subscript merupakan ekspresi yang menghasilkan integer dalam banyak kasus, atau VARCHAR2 untuk associative arrays yang dideklarasikan dengan string-string sebagai keys (kunci).

Jangkauan yang diperbolehkan untuk subscript adalah:

  • Untuk nested tables, 1..2**31.
  • Untuk varrays, 1..size_limit, dimana kita menentukan batas di dalam deklarasi.
  • Untuk associative arrays dengan kunci numerik (numeric key), -2**31..2**31.
  • Untuk associative arrays dengan kunci string (string key), panjang dari kunci dan jumlah nilai-nilai yang mungkin bergantung pada batas panjang VARCHAR2 di dalam deklarasi tipe, dan database character set.

Contoh: Mereferensi Elemen Nested Table dengan Subscript

Contoh berikut ini menunjukkan bagaimana mereferensi elemen di dalam nested table NAMES:

DECLARE
TYPE Roster IS TABLE OF VARCHAR2(15);
names Roster := Roster('J Hamil', 'D Caruso', 'R Singh');
BEGIN
  FOR i IN names.FIRST .. names.LAST
  LOOP
    IF names(i) = 'J Hamil' THEN
     NULL;
    END IF;
  END LOOP;
END;

Contoh: Melewatkan Elemen Nested Table sebagai Parameter

Contoh berikut ini menunjukkan bahwa kita dapat mereferensi elemen-elemen dari collection di dalam pemanggilan-pemanggilan subprogram:

DECLARE
TYPE Roster IS TABLE OF VARCHAR2(15);
names Roster := Roster('J Hamil', 'D Piro', 'R Singh');
i BINARY_INTEGER := 2;
BEGIN
  verify_name(names(i)); -- call procedure
END;

5.6. Memberikan Nilai Collections

Sebuah collection dapat diberikan kepada lainnya dengan perintah INSERT, UPDATE, FETCH, atau SELECT, perintah-perintah pemberian nilai (assignment statement), atau pemanggilan subprogram.

Kita dapat memberikan nilai dari ekspresi ke elemen tertentu di dalam collection dengan menggunakan sintaks:collection_name(subscript):= expression;

dimana expression menghasilkan nilai dari tipe yang telah ditentukan untuk elemen-elemen di dalam definisi collection type.

Contoh: Kompatibilitas Tipe Data

Contoh berikut ini menunjukkan bahwa collections harus memiliki tipe data yang sama agar pemberian nilai dapat bekerja. Memiliki tipe elemen yang sama tidaklah cukup.

DECLARE
  TYPE Clientele IS VARRAY(100) OF Customer;
  TYPE Vips IS VARRAY(100) OF Customer;
  -- Dua variable pertama ini memiliki tipe data yang sama.
  group1 Clientele := Clientele(...);
  group2 Clientele := Clientele(...);
  -- Variable ketiga ini memiliki deklarasi yang mirip,
  -- namun tidak memiliki tipe yang sama.
  group3 Vips := Vips(...);
BEGIN
  -- Diijinkan karena mereka memiliki tipe data yang sama
  group2 := group1;
  -- Tidak diijinkan karena mereka memiliki tipe data yang berbeda
  group3 := group2;
END;

Contoh: Memberikan Nilai Null ke Nested Table

Kita memberikan nilai nested table null secara atomik atau varray untuk nested table atau varray kedua. Dalam kasus ini, collection kedua harus diinisialisasi ulang:

DECLARE
  TYPE Clientele IS TABLE OF VARCHAR2(64);
  -- Nested table ini memiliki beberapa nilai-nilai.
  group1 Clientele := Clientele('Customer 1','Customer 2');
  -- Nested table tidak diinisialisasi ("atomically null").
  group2 Clientele;
BEGIN
  -- Pertama, pengecekan IF group1 IS NULL menghasilkan FALSE.
  -- Lalu kita memberikan nested table null kepada group1.
  group1 := group2;
  -- Sekarang, pengecekan IF group1 IS NULL menghasilkan TRUE.
  -- Kita harus menggunakan constructor lain untuk memberikan nilai kepadanya.
END;

Dengan cara yang sama, memberikan nilai NULL kepada collection membuatnya null secara atomik.

Contoh: Eksepsi-eksepsi yang Mungkin untuk Pemberian Nilai Collection

Memberikan nilai kepada elemen collection dapat menyebabkan banyak eksepsi (exception):

  • Jika subscript null atau tidak dapat dikonversi ke tipe data yang tepat, PL/SQL memunculkan predefined exception VALUE_ERROR. Biasanya, subscript haruslah integer. Associative arrays dapat juga dideklarasikan untuk memiliki subscript-subscript VARCHAR2.
  • Jika subscript mereferensi ke elemen yang tidak terinisialisasi, PL/SQL memunculkan SUBSCRIPT_BEYOND_COUNT.
  • Jika collection secara atomik adalah null, PL/SQL memunculkan COLLECTION_IS_NULL.
DECLARE
  TYPE WordList IS TABLE OF VARCHAR2(5);
  words WordList;
BEGIN
  /* Assume execution continues despite the raised exceptions. */
  -- Memunculkan COLLECTION_IS_NULL. Kita belum menggunakan constructor.
  -- Eksepsi ini diberlakukan untuk varrays dan nested tables, namun tidak
  -- associative arrays yang mana tidak memerlukan constructor.
  words(1) := 10;
  -- Setelah menggunakan constructor, kita dapat memberikan nilai ke elemen-elemen.
  words := WordList(10,20,30);
  -- Suatu ekspresi yang menghasilkan VARCHAR2(5) adalah OK.
  words(1) := 'yes';
  words(2) := words(1) || 'no';
  -- Memunculkan VALUE_ERROR karena nilai yang diberikan terlalu panjang.
  words(3) := 'longer than 5 characters';
  -- Memunculkan VALUE_ERROR karena subscript dari nested table harus integer
  words('B') := 'dunno';
  -- Memunculkan SUBSCRIPT_BEYOND_COUNT karena kita hanya membuat 3 elemen
  -- di dalam constructor. Untuk menambahkan yang baru, kita harus memanggil method EXTEND terlebih dahulu
  words(4) := 'maybe';
END;

5.7. Membandingkan Collection

Kita dapat memeriksa apakah sebuah collection null, namun tidak untuk memeriksa apakah dua buah collection sama atau tidak. Kondisi-kondisi seperti lebih besar dari, lebih kecil dari, dan seterusnya juga tidak diperbolehkan.

Contoh: Memeriksa Apakah Collection Null

Nested tables dan varrays dapat secara atomik null, sehingga mereka dapat diperiksa apakah null atau tidak:

DECLARE
  TYPE Staff IS TABLE OF Employee;
  members Staff;
BEGIN
  -- Kondisi menghasilkan TRUE karena kita tidak belum menggunakan constructor.
  IF members IS NULL THEN ...
END;

Contoh: Membandingkan Dua Collection

Collections tidak dapat secara langsung dibandingkan untuk kesamaan atau ketidaksamaannya. Sebagai contoh, kondisi IF berikut ini tidak diperbolehkan:

DECLARE
  TYPE Clientele IS TABLE OF VARCHAR2(64);
  group1 Clientele := Clientele('Customer 1', 'Customer 2');
  group2 Clientele := Clientele('Customer 1', 'Customer 3');
BEGIN
  -- Pengecekan kesamaan menyebabkan compilation error.
  IF group1 = group2 THEN
    ...
  END IF;
END;

Batasan ini juga berlaku untuk perbandingan-perbandingan implisit. Sebagai contoh, collections tidak dapat nampak di dalam daftar DISTINCT, GROUP BY, atau ORDER BY.
Jika kita ingin melakukan operasi-operasi perbandingan seperti itu, kita harus mendefinisikan gagasan kita sendiri mengenai artinya bagi collection untuk sama dengan atau lebih besar dari, lebih kecil dari, dan seterusnya, dan menulis satu atau lebih function untuk menguji collections dan elemen-elemennya dan menghasilkan nilai true atau false.

Oracle MagazineOracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world’s largest enterprise software company.

For more information about Oracle, please visit their Web site at http://www.oracle.com. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Get Free Oracle Magazine

 

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12


Bookmark and Share

 

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.

 

Find Related articles