PL/SQL Object Types

10.13. Memanipulasi Objects

Kita dapat menggunakan sebuah object type di dalam perintah CREATE STATEMENT untuk menentukan tipe data dari sebuah column. Sekali table tersebut diciptakan, kita dapat menggunakan perintah-perintah SQL untuk menambahkan sebuah object, menampilkan attributes-nya, memanggil methods-nya, dan memodifikasi state-nya.

Catatan: Mengakses remote atau distributed objects tidak diperbolehkan.

Di dalam script SQL*Plus di bawah ini, perintah INSERT memanggil constructor untuk object type Rational, kemudian menambahkan object hasilnya. Perintah SELECT menampilkan nilai dari attribute num. perintah UPDATE memanggil member method reciprocal(), yang menghasilkan sebuah nilai Rational setelah menukar attributes num dan den. Perhatikan bahwa sebuah table alias diperlukan ketika kita mereferensi sebuah attribute atau method.

CREATE TABLE numbers (rn Rational, ...)
/
INSERT INTO numbers (rn) VALUES (Rational(3, 62)) -- inserts 3/62
/
SELECT n.rn.num INTO my_num FROM numbers n ... -- returns 3
/
UPDATE numbers n SET n.rn = n.rn.reciprocal() ... -- yields 62/3

Ketika kita memulai sebuah object dengan cara ini, ia tidak memiliki identitas di luar database table. Namun, object type tersebut ada secara independen dari suatu table, dan dapat digunakan untuk menciptakan objek-objek dengan cara lain.

Di dalam contoh berikutnya, kita menciptakan sebuah table yang menyimpan objek-objek dari type Rational di dalam baris-baris datanya. Table-table seperti ini, memiliki baris-baris data dari objek-objek, yang disebut dengan object tables. Setiap column di dalam baris terkait dengan sebuah attribute dari object type tersebut. Baris-baris dapat memiliki nilai-nilai column yang berbeda.

CREATE TABLE rational_nums OF Rational;

Setiap baris di dalam sebuah object table memiliki sebuah object identifier, yang secara unik membedakan objek yang disimpan di baris itu dan bertindak sebagai sebuah referensi ke objek tersebut.

10.13.1. Menampilkan Objects

Asumsikan bahwa kita menjalankan script SQL*Plus berikut ini, yang menciptakan object type Person dan object table persons, dan dimana kita harus mempopulasikan table tersebut:

CREATE TYPE Person AS OBJECT (
first_name VARCHAR2(15),
last_name VARCHAR2(15),
birthday DATE,
home_address Address,
phone_number VARCHAR2(15))
/
CREATE TABLE persons OF Person
/

Subquery berikut ini memproduksi sebuah result set dari baris-baris data yang mengandung hanya atribut-atribut dari objek-objek Persons:

BEGIN
INSERT INTO employees -- another object table of type Person
SELECT * FROM persons p WHERE p.last_name LIKE '%Smith';

Untuk menghasilkan sebuah result set dari objek-objek, kita harus menggunakan function VALUE, yang akan kita diskusikan pada pembahasan berikutnya.

10.13.1.1. Menggunakan Function VALUE

Seperti yang mungkin kita duga, function VALUE menghasilkan nilai dari sebuah object. VALUE mengambil sebuah variable korelasi sebagai argumennya. (Dalam konteks ini, sebuah correlation variable merupakan variable baris atau table alias yang terasosiasi dengan sebuah baris data di dalam sebuah object table). Sebagai contoh, untuk menghasilkan sebuah result set dari Person objects, kita menggunakan VALUE seperti berikut ini:

BEGIN
  INSERT INTO employees
  SELECT VALUE(p) FROM persons p
  WHERE p.last_name LIKE '%Smith';

Dalam contoh berikutnya, kita menggunakan VALUE untuk menghasilkan sebuah Person object tertentu:

DECLARE
p1 Person;
p2 Person;
...
BEGIN
  SELECT VALUE(p) INTO p1 FROM persons p
  WHERE p.last_name = 'Kroll';
  p2 := p1;
  ...
END;

Pada titik ini, p1 menampung sebuah Person object lokal, yang merupakan sebuah duplikat dari stored object yang nama belakangnya adalah ‘Kroll’, dan p2 menampung objek Person yang lain, yang merupakan duplikat dari p1. Seperti ditunjukkan oleh contoh berikut ini, kita dapat menggunakan variable-variable ini untuk mengakses dan memodifikasi objek-objek yang ditampungnya:

BEGIN
  p1.last_name := p1.last_name || ' Jr';

Sekarang, objek lokal Person yang ditampung oleh p1 memiliki nama belakang ‘Kroll Jr’.

10.13.1.2. Menggunakan Function REF

Kita dapat menampilkan refs dengan menggunakan function REF, yang mana, seperti halnya VALUE, mengambil sebuah correlation variable sebagai argumennya. Di dalam contoh berikut ini, kita menampilkan satu atau lebih refs ke Person objects, kemudian menambahkan refs ke dalam table person_refs:

BEGIN
  INSERT INTO person_refs
  SELECT REF(p) FROM persons p
  WHERE p.last_name LIKE '%Smith';

Dalam contoh berikut ini, kita menampilkan sebuah ref dan attribute pada saat yang bersamaan:

DECLARE
  p_ref REF Person;
  taxpayer_id VARCHAR2(9);
BEGIN
  SELECT REF(p), p.ss_number INTO p_ref, taxpayer_id
  FROM persons p
  WHERE p.last_name = 'Parker'; -- harus menghasilkan satu baris data
  ...
END;

Di dalam contoh terakhir, kita memodifikasi atribut-atribut dari sebuah Person object:

DECLARE
  p_ref REF Person;
  my_last_name VARCHAR2(15);
BEGIN
  SELECT REF(p) INTO p_ref FROM persons p
  WHERE p.last_name = my_last_name;
  UPDATE persons p
  SET p = Person('Jill', 'Anders', '11-NOV-67', ...)
  WHERE REF(p) = p_ref;
END;

10.13.1.3. Pengujian Dangling Refs

Jika object dimana sebuah ref menunjuk dihapus, ref tersebut meninggalkan dangling (menunjuk kepada sebuah objek yang tidak ada). Untuk menguji kondisi ini, kita dapat menggunakan predikat SQL yaitu IS DANGLING. Sebagai contoh, misalkan column manager di dalam table department menampung refs terhadap Employee objects yang tersimpan di dalam sebuah object table. Kita dapat menggunakan perintah UPDATE berikut ini untuk mengkonversi suatu dangling refs menjadi nulls:

UPDATE department SET manager = NULL WHERE manager IS DANGLING;

10.13.1.4. Menggunakan Function DEREF

Kita tidak dapat melakukan navigasi melewati refs bersama dengan perintah prosedural PL/SQL. Namun, kita harus menggunakan function DEREF di dalam sebuah perintah SQL. (DEREF merupakan kependekan dari dereference. Ketika kita melakukan dereference terhadap sebuah pointer, kita akan mendapatkan nilai dimana ia menunjuk.) DEREF mengambil referensi kepada sebuah object sebagai argumennya, dan kemudian menghasilkan nilai dari object tersebut. Jika ref tersebut dangling, DEREF menghasilkan sebuah null object.

Dalam contoh di bawah ini, kita melakukan dereference terhadap sebuah ref terhadap sebuah Person object. Perhatikan bahwa kita menampilkan ref tersebut dari dummy table dual. Kita tidak perlu menentukan sebuah object table dan kriteria pencariannya karena sebuah object yang tersimpan di dalam sebuah object table memiliki sebuah objek identifier yang unik dan tetap, yang merupakan bagian dari setiap ref terhadap object tersebut.

DECLARE
  p1 Person;
  p_ref REF Person;
  name VARCHAR2(15);
BEGIN
  ...
  /* Asumsikan bahwa p_ref menampung sebuah referensi valid
  ke sebuah object yang tersimpan di dalam sebuah object table. */
  SELECT DEREF(p_ref) INTO p1 FROM dual;
  name := p1.last_name;

Kita dapat menggunakan DEREF didalam perintah-perintah SQL yang berurutan untuk melakukan dereference terhadap refs, seperti ditunjukkan oleh contoh berikut ini:

CREATE TYPE PersonRef AS OBJECT (p_ref REF Person)
/
DECLARE
name VARCHAR2(15);
pr_ref REF PersonRef;
pr PersonRef;
p Person;
BEGIN
  ...
  /* Asumsikan pr_ref menampung sebuah referensi valid. */
  SELECT DEREF(pr_ref) INTO pr FROM dual;
  SELECT DEREF(pr.p_ref) INTO p FROM dual;
  name := p.last_name;
  ...
END
/

Contoh berikutnya menunjukkan bahwa kita tidak dapat menggunakan function DEREF bersama dengan perintah-perintah prosedural:

BEGIN
  ...
  p1 := DEREF(p_ref); -- tidak diperbolehkan

Bersama perintah-perintah SQL, kita dapat menggunakan notasi titik untuk melakukan navigasi melalui object columns ke ref attributes dan melalui satu ref attribute ke lainnya. Kita juga dapat melakukan navigasi melalui ref columns ke attributes jika kita menggunakan sebuah table alias. Sebagai contoh, sintaks berikut ini adalah benar (valid):

table_alias.object_column.ref_attribute
table_alias.object_column.ref_attribute.attribute
table_alias.ref_column.attribute

Asumsikan bahwa kita menjalankan script SQL*Plus berikut ini, yang menciptakan object types Address dan Person dan object table persons:

CREATE TYPE Address AS OBJECT (
street VARCHAR2(35),
city VARCHAR2(15),
state CHAR(2),
zip_code INTEGER)
/
CREATE TYPE Person AS OBJECT (
first_name VARCHAR2(15),
last_name VARCHAR2(15),
birthday DATE,
home_address REF Address, -- digunakan bersama dengan Person objects lainnya
phone_number VARCHAR2(15))
/
CREATE TABLE persons OF Person
/

Ref attribute home_address berkorespondensi dengan sebuah column di dalam object table persons yang menampung refs terhadap Address objects yang tersimpan di dalam beberapa table yang lain. Setelah mempopulasikan table-table tersebut, kita dapat menampilkan sebuah alamat tertentu dengan melakukan dereferece terhadap ref-nya, seperti berikut ini:

DECLARE
  addr1 Address,
  addr2 Address,
  ...
BEGIN
  SELECT DEREF(home_address) INTO addr1 FROM persons p
  WHERE p.last_name = 'Derringer';

Di dalam contoh di bawah ini, kita melakukan navigasi melalui ref column home_address ke attribute street. Dalam kasus ini, diperlukan sebuah table alias.

DECLARE
  my_street VARCHAR2(25),
  ...
BEGIN
  SELECT p.home_address.street INTO my_street FROM persons p
  WHERE p.last_name = 'Lucas';

10.13.2. Menambahkan Objects

Kita menggunakan perintah INSERT untuk menambahkan objects ke dalam sebuah object table. Dalam congoh berikut ini, kita menambahkan sebuah Person object ke dalam object table persons:

BEGIN
  INSERT INTO persons
  VALUES ('Jenifer', 'Lapidus', ...);

Alternatifnya, kita dapat menggunakan sebuah constructor untuk object type Person untuk menambahkan sebuah object ke dalam object table persons:

BEGIN
  INSERT INTO persons
  VALUES (Person('Albert', 'Brooker', ...));

Dalam contoh berikutnya, kita menggunakan klausa RETURNING untuk menyimpan Person refs di dalam local variables. Perlu dicatat bagaimana klausa tersebut meniru sebuah perintah SELECT. Kita juga dapat menggunakan klausa RETURNING di dalam perintah-perintah UPDATE dan DELETE.

DECLARE
  p1_ref REF Person;
  p2_ref REF Person;
BEGIN
  INSERT INTO persons p
  VALUES (Person('Paul', 'Chang', ...))
  RETURNING REF(p) INTO p1_ref;
  INSERT INTO persons p
  VALUES (Person('Ana', 'Thorne', ...))
  RETURNING REF(p) INTO p2_ref;

Untuk menambahkan objects ke dalam sebuah object table, kita dapat menggunakan sebuah subquery yang menghasilkan objects dari type yang sama. Contohnya adalah sebagai berikut:

BEGIN
  INSERT INTO persons2
  SELECT VALUE(p) FROM persons p
  WHERE p.last_name LIKE '%Jones';

 

Baris-baris data yang di-copy ke object table persons2 diberikan object identifiers baru. Tidak ada object identifiers yang di-copy-kan dari object table persons.

Script di bawah ini menciptakan sebuah relational table dengan nama department, yang memiliki sebuah column dengan type Person, kemudian menambahkan sebuah baris data ke dalam table tersebut. Perhatikan bagaimana constructor Person() menyediakan sebuah nilai untuk column manager.

CREATE TABLE department (
dept_name VARCHAR2(20),
manager Person,
location VARCHAR2(20))
/
INSERT INTO department
VALUES ('Payroll', Person('Alan', 'Tsai', ...), 'Los Angeles')
/

Person object baru yang disimpan di dalam column manager tidak dapat direferensi karena ia disimpan di dalam sebuah column (bukan sebuah baris) dan dengan demikian tidak memiliki object identifier.

10.13.3. Memodifikasi Objects

Untuk memodifikasi atribut-atribut dari objek-objek di dalam sebuah object table, kita menggunakan perintah UPDATE, seperti ditunjukkan oleh contoh berikut ini:

BEGIN
  UPDATE persons p SET p.home_address = '341 Oakdene Ave'
  WHERE p.last_name = 'Brody';
  UPDATE persons p SET p = Person('Beth', 'Steinberg', ...)
  WHERE p.last_name = 'Steinway';
END;

10.13.4. Menghapus Objects

Kita menggunakan perintah DELETE untuk menghapus objek-objek (baris-baris) dari sebuah object table. Untuk menghapus objek-objek tertentu, kita menggunakan klausa WHERE, seperti berikut:

BEGIN
  DELETE FROM persons p
  WHERE p.home_address = '108 Palm Dr';
END;

Silahkan melanjutkan membaca pembahasan Native Dynamic SQL

 

 

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


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