Mencicipi ORDB dengan Oracle


Jika rekan-rekan ingin mencicipi tentang object relational database sederhana di Oracle 10g, artikel yang saya tulis ini semoga dapat memberikan gambaran tentang hal itu. Saya menulisnya di Oracle 10g Enterprise Edition, untuk Oracle 10g XE belum saya coba. Tapi yang jelas untuk Oracle10g XE, nested table masih dapat diterima.

Latihan sederhana ini akan saya dasari dari skema UML Class Diagram berikut :

Berdasar UML di atas, jika diuraikan dengan kalimat dapat kita katakan sebuah Bangun dapat tersusun dari beberapa Bidang, baik Segitiga ataupun Lingkaran, yang memiliki koordinat x dan y, serta memiliki warna (Red, Green dan Blue). Dari setiap Segitiga dan Lingkaran dapat dihitung Luas dan Kelilingnya.

Untuk menerapkan model UML tersebut ke database Oracle, kita dapat mendefinisikan terlebih dahulu objek Warna. Berikut deklarasi objek di Oracle:

create type warna as object(
r number(3),
b number(3),
g number(3),
member function getWarna return varchar
);
/

create type body warna as
member function getWarna return varchar is
begin
return 'Red=' || to_char(self.r) || ', Blue=' || to_char(self.b) ||

', Green=' || to_char(self.g);
end;
end;
/

Pada deklarasi class Warna, kita definisikan atribut warna r, g, dan blue serta memiliki sebuah method yaitu getWarna() yang mengembalikan string tentang nilai tiap komponen warna. Selanjutnya kita dapat mendefinisikan class Bidang sebagai berikut :
create type Bidang as object(
x number(3),
y number(3),
color warna,
member function getLuas return number,
member function getKeliling return number
) NOT FINAL;
/

create type body Bidang as
member function getLuas return number is
begin
return 0;
end;
member function getKeliling return number is
begin
return 0;
end;
end;
/

Oleh karena class Bidang nanti diturunkan ke class Segitiga dan Lingkaran yang masing-masing dapat dihitung Luas dan Kelilingnya, maka pada ORDB Oracle, kita juga harus mendeklarasikan kedua method tersebut di class induknya, yaitu di class Bidang. Hal terpenting untuk class Bidang adalah, karena ia menjadi class induk, maka class Bidang harus diberikan kata kunci NOT FINAL, yang berarti dari class Bidang dapat diturunkan ke class lainnya.

Kita dapat mendefinisikan class Segitiga dan Lingkaran yang merupakan turunan dari class Bidang dengan menggunakan UNDER.

create or replace type Segitiga under Bidang (
alas number(10,3),
tinggi number(10,2),
overriding member function getLuas return number,
overriding member function getKeliling return number
);
/

create or replace type body Segitiga as
overriding member function getLuas return number is
begin
return 0.5 * self.alas * self.tinggi;
end;
overriding member function getKeliling return number is
begin
return 3 * self.alas;
end;
end;
/

create or replace type Lingkaran under Bidang (
r number(10,3),
overriding member function getLuas return number,
overriding member function getKeliling return number
);
/

create or replace type body Lingkaran as
overriding member function getLuas return number is
begin
return 3.14 * self.r * self.r;
end;
overriding member function getKeliling return number is
begin
return 2 * 3.14 * self.r;
end;
end;
/

Oleh karena sifat dan operasi luas dan keliling dari class Segitiga dan Lingkaran masing-masing berbeda, maka dalam kedua class tersebut untuk definisi method getLuas() dan getKeliling() harus diberikan OVERRIDING di depan deklarasi MEMBER FUNCTION.

Berikutnya kita akan definisikan class Bangun yang salah satu atributnya memiliki nilai 1 atau lebih dari class Bidang dan turunannya.

create or replace type bidang_tab as table of bidang;
/

create or replace type Bangun as object(
nama varchar(10),
mybidang bidang_tab)
/

Untuk mendefinisikan tipe array pada ORDB Oracle, salah satu cara yang dapat kita lakukan adalah menggunakan Nested Table, yaitu dengan TABLE OF. Tipe bidang_tab di atas merupakan tipe yang dapat menyimpan nilai lebih dari satu.

Oleh karena kita nantinya dapat menyimpan objek pada tabel Bangun, maka kita harus membuat sebuah tabel bertipe class Bangun berikut :

create table bangun_tab of bangun (
primary key (nama)
) nested table mybidang store as mybangun_tab;

Sekarang, kita telah memiliki sebuah tabel yang dapat menyimpan objek-objek bertipe class Bangun. Yang perlu diperhatikan pada deklarasi DDL pembuatan tabel bertipe bangun di atas adalah karena salah satu atribut pada Class Bangun bertipe TABLE OF, maka pada pembuatan tabelnya juga harus diberikan perintah NESTED TABLE yang menyatakan nilai-nilai TABLE OF tersebut akan disimpan tersendiri sebagai MYBANGUN_TAB..

Untuk melakukan penambahan data ke tabel BANGUN_TAB, kita dapat memberikan perintah INSERT berikut :

insert into bangun_tab values ('test1', bidang_tab(segitiga(0, 0, warna(0, 0, 0), 10.0, 20.0), segitiga(100, 100, warna(65, 0, 0), 20.0, 5.0), bidang(20.0, 20.0, warna(0, 0, 0))));

insert into bangun_tab values ('test2', bidang_tab(lingkaran(0, 0, warna(255, 255, 255), 20.0), segitiga(200, 200, warna(65, 0, 0), 20.0, 5.0)));

Untuk melihat daftar record pada tabel BANGUN_TAB yang sudah tersimpan, kita dapat memberikan query sebagai berikut :

SQL> col warna format a25
SQL> select nama, b.color.getWarna() "warna", b.getLuas() "Luas", b.getKeliling() "Keliling"
2 from bangun_tab, table(bangun_tab.mybidang) b;

NAMA warna Luas Keliling
---------- ------------------------- ---------- ----------
test1 Red=0, Blue=0, Green=0 100 30
test1 Red=65, Blue=0, Green=0 50 60
test1 Red=0, Blue=0, Green=0 0 0

Manarik bukan? Selamat mencoba.

2 thoughts on “Mencicipi ORDB dengan Oracle

  1. siip okeh deh!!!

    aku lagi mo bikin riset tentang ORDBMS nih,,tapi masih bingung mo ambil judul apaan,,
    punya ide??
    tp paling lambat besok jumat..
    thx bgt..

  2. Buat aja sebagai pendekatan untuk pembangunan sistem informasi tertentu, sekaligus dibuat programnya. Bisa juga mungkin membandingkan antara pendekatan OORDB dan RDB. Kalau yang terakhir ini perlu didefinisikan parameter pembandingnya apa saja.

Komentar ditutup.