Oracle Tutorial Tipe Objek PL/SQL dengan CONTOH
Apa Tipe Objek di PL/SQL?
Pemrograman Berorientasi Objek sangat cocok untuk membangun komponen yang dapat digunakan kembali dan aplikasi yang kompleks. Komponen-komponen tersebut diorganisasikan berdasarkan "objek" dan bukan "tindakan", yaitu program dirancang untuk bekerja dan berinteraksi dengan keseluruhan objek dan bukan tindakan tunggal. Konsep ini memungkinkan programmer untuk mengisi dan memanipulasi detail pada tingkat entitas objek.
Gambar di bawah ini menggambarkan contoh tipe objek di mana rekening bank dianggap sebagai entitas objek. Atribut objek mencakup hal-hal yang memiliki beberapa nilai atribut, misalnya pada Rekening Bank; itu adalah nomor rekening, saldo bank, dll. sedangkan metode objek menjelaskan hal-hal seperti menghitung suku bunga, menghasilkan laporan bank, dll. yang memerlukan proses tertentu untuk diselesaikan.
Dalam pemrograman berorientasi objek PL/SQL didasarkan pada tipe objek.
Tipe objek dapat mewakili entitas dunia nyata apa pun. Kita akan membahas lebih banyak tipe objek di bab ini.
Komponen Jenis Objek
PL / SQL tipe objek terutama berisi dua komponen.
- atribut
- Anggota/Metode
atribut
Atribut adalah kolom atau field tempat data disimpan. Setiap atribut akan dipetakan ke tipe data yang menentukan tipe pemrosesan dan penyimpanan untuk atribut tersebut. Atributnya bisa berupa apa saja yang valid Tipe data PL/SQL, atau bisa juga dari tipe objek lain.
Anggota/Metode
Anggota atau Metode adalah subprogram yang didefinisikan dalam tipe objek. Mereka tidak digunakan untuk menyimpan data apa pun. Mereka terutama digunakan untuk mendefinisikan proses di dalam tipe objek. Misalnya memvalidasi data sebelum mengisi tipe objek. Mereka dideklarasikan di bagian tipe objek dan didefinisikan di bagian badan tipe objek dari tipe objek. Bagian badan pada tipe objek merupakan bagian opsional. Jika tidak ada anggota, maka tipe objek tidak akan berisi bagian tubuh.
Buat Objek di Oracle
Tipe Objek tidak dapat dibuat pada tingkat subprogram, Tipe Objek hanya dapat dibuat pada tingkat skema. Setelah tipe objek ditentukan dalam skema, maka tipe objek yang sama dapat digunakan dalam subprogram. Tipe objek dapat dibuat menggunakan 'CREATE TYPE'. Badan tipe hanya dapat dibuat setelah membuat tipe objeknya.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan pembuatan 'OBJECT' dengan atribut dan 'OBJECT-BODY' dengan metode.
- Metodenya juga bisa kelebihan beban di badan objek.
Inisialisasi Deklarasi Tipe Objek
Seperti komponen lain di PL/SQL, tipe objek juga perlu dideklarasikan sebelum digunakan dalam program.
Setelah tipe objek dibuat, tipe objek tersebut dapat digunakan di bagian deklaratif subprogram untuk mendeklarasikan variabel tipe objek tersebut.
Setiap kali variabel apa pun dideklarasikan dalam subprogram sebagai tipe objek, pada saat run-time sebuah instance baru dari tipe objek tersebut akan dibuat, dan instance yang baru dibuat ini dapat dirujuk ke nama variabel. Dengan cara ini, satu jenis objek dapat menyimpan banyak nilai dalam contoh berbeda.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan deklarasi variabel sebagai tipe objek di bagian deklaratif.
Setelah variabel dideklarasikan sebagai tipe objek dalam subprogram, variabel tersebut akan menjadi null secara atomik, yaitu seluruh objek itu sendiri menjadi null. Variabel tersebut perlu diinisialisasi dengan nilai untuk menggunakannya dalam program. Nilai tersebut dapat diinisialisasi menggunakan konstruktor.
Konstruktor adalah metode implisit dari suatu objek yang dapat dirujuk dengan nama yang sama dengan tipe objeknya. Sintaks di bawah ini menunjukkan inisialisasi tipe objek.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan inisialisasi instance tipe objek dengan nilai null.
- Sekarang objek itu sendiri bukan null seperti yang telah diinisialisasi, namun atribut di dalam objek akan menjadi null karena kita belum menetapkan nilai apa pun ke atribut ini.
Konstruktor
Konstruktor adalah metode implisit dari suatu objek yang dapat dirujuk dengan nama yang sama dengan tipe objeknya. Setiap kali objek dirujuk untuk pertama kalinya, konstruktor ini akan dipanggil secara implisit.
Kita juga dapat menginisialisasi objek menggunakan konstruktor ini. Konstruktor dapat didefinisikan secara eksplisit dengan mendefinisikan anggota dalam badan tipe objek dengan nama tipe objek yang sama.
Contoh 1: Dalam contoh berikut, kita akan menggunakan anggota tipe objek untuk memasukkan rekaman ke dalam tabel emp dengan nilai ('RRR', 1005, 20000, 1000) dan ('PPP', 1006, 20000, 1001). Setelah data dimasukkan, kita akan menampilkannya menggunakan anggota tipe objek. Kita juga akan menggunakan konstruktor eksplisit untuk mengisi id manajer secara default dengan nilai 1001 untuk rekaman kedua.
Kami akan menjalankannya dalam langkah-langkah di bawah ini.
- Step1:
- Buat tipe Objek
- Badan tipe objek
- Langkah2: Membuat blok anonim untuk memanggil tipe objek yang dibuat melalui konstruktor implisit untuk emp_no 1005.
- Langkah3: Membuat blok anonim untuk memanggil tipe objek yang dibuat melalui konstruktor eksplisit untuk emp_no 1006.
Langkah 1) Buat tipe Objek dan badan tipe Objek
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line(’Constructor fired..'); SELF.emp_no:=p_emp_no;| SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.managerial:=1001; RETURN; END: MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_noemp_name,salary,manager); END MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary':'||salary); Dbms_output.put_line('Manager:'||manager); END: END: /
Penjelasan Kode
- Baris kode 1-9: Membuat tipe objek 'emp_object' dengan 4 atribut dan 3 anggota. Ini berisi definisi konstruktor dengan hanya 3 parameter. (Konstruktor implisit sebenarnya akan berisi jumlah parameter yang sama dengan jumlah atribut yang ada pada tipe objek)
- Baris kode 10: Membuat tipe badan.
- Baris kode 11-21: Mendefinisikan konstruktor eksplisit. Menetapkan nilai parameter ke atribut dan menetapkan nilai untuk atribut 'manager' dengan nilai default '1001'.
- Baris kode 22-26: Mendefinisikan anggota 'insert_records' yang nilai atributnya dimasukkan ke dalam tabel 'emp'.
- Baris kode 27-34: Mendefinisikan anggota 'display_records' yang menampilkan nilai atribut tipe objek.
Keluaran
Ketik dibuat
Tipe badan dibuat
Langkah 2) Membuat blok anonim untuk memanggil tipe objek yang dibuat melalui konstruktor implisit untuk emp_no 1005
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,’RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Penjelasan Kode
- Baris kode 37-45: Memasukkan catatan menggunakan konstruktor implisit. Panggilan ke konstruktor berisi jumlah nilai atribut sebenarnya.
- Baris kode 38: Mendeklarasikan guru_emp_det sebagai tipe objek 'emp_object'.
- Baris kode 41: Pernyataan 'guru_emp_det.display_records' disebut fungsi anggota 'diplay_records' dan nilai atribut ditampilkan
- Baris kode 42: Pernyataan 'guru_emp_det.insert_records' disebut fungsi anggota 'insert_records' dan nilai atribut dimasukkan ke dalam tabel.
Keluaran
Nama Karyawan : RRR
Nomor Karyawan: 1005
Gaji: 20000
Manajer : 1000
Langkah 3) Membuat blok anonim untuk memanggil tipe objek yang dibuat melalui konstruktor eksplisit untuk emp_no 1006
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Keluaran
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Penjelasan Kode:
- Baris kode 46-53: Memasukkan catatan menggunakan konstruktor eksplisit.
- Baris kode 46: Mendeklarasikan guru_emp_det sebagai tipe objek 'emp_object'.
- Baris kode 50: Pernyataan 'guru_emp_det.display_records' disebut fungsi anggota 'display_records' dan nilai atribut ditampilkan
- Baris kode 51: Pernyataan 'guru_emp_det.insert_records' disebut fungsi anggota 'insert_records' dan nilai atribut dimasukkan ke dalam tabel.
Warisan dalam Tipe Objek
Properti warisan memungkinkan tipe subobjek mengakses semua atribut dan anggota tipe objek super atau tipe objek induk.
Tipe sub-objek disebut tipe objek yang diwarisi, dan tipe objek super disebut tipe objek induk. Sintaks di bawah ini menunjukkan cara membuat tipe objek induk dan warisan.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan pembuatan tipe SUPER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan pembuatan tipe SUB. Ini berisi semua anggota dan atribut dari tipe objek induk.
Contoh1: Dalam contoh di bawah ini, kita akan menggunakan properti pewarisan untuk menyisipkan rekaman dengan ID manajer sebagai '1002' untuk rekaman berikut ('RRR', 1007, 20000).
Kita akan menjalankan program di atas dalam langkah-langkah berikut
- Langkah1: Buat tipe SUPER.
- Langkah 2: Buat tipe dan isi SUB.
- Langkah3: Membuat blok anonim untuk memanggil tipe SUB.
Langkah 1) Buat tipe SUPER atau tipe Induk.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Penjelasan Kode:
- Baris kode 1-9: Membuat tipe objek 'emp_object' dengan 4 atribut dan 3 anggota. Ini berisi definisi konstruktor dengan hanya 3 parameter. Telah dinyatakan sebagai 'BUKAN FINAL' sehingga merupakan tipe induk.
Langkah 2) Buat tipe SUB di bawah tipe SUPER.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name:salary,manager): END; END; /
Penjelasan Kode:
- Baris kode 10-13: Membuat sub_emp_object sebagai tipe yang diwarisi dengan tambahan satu atribut 'default_manager' dan deklarasi prosedur anggota.
- Baris kode 14: Membuat isi untuk tipe objek yang diwarisi.
- Baris kode 16-21: Mendefinisikan prosedur anggota yang memasukkan record ke dalam tabel “emp” dengan nilai dari tipe objek 'SUPER', kecuali nilai manajer. Untuk nilai manajer menggunakan tipe 'default_manager' dari 'SUB'.
Langkah 3) Membuat blok anonim untuk memanggil tipe SUB
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Penjelasan Kode:
- Baris kode 25: Mendeklarasikan 'guru_emp_det' sebagai tipe 'sub_emp_object'.
- Baris kode 27: Menginisialisasi objek dengan konstruktor implisit. Konstruktor memiliki 5 parameter (4 atribut dari tipe PARENT dan 2 atribut dari tipe SUB). Parameter terakhir (1002)mendefinisikan nilai atribut default_manager
- Baris kode 28: Memanggil anggota 'insert_default_mgr' untuk memasukkan catatan dengan id manajer default yang diteruskan ke konstruktor.
Kesetaraan Objek PL/SQL
Contoh objek yang dimiliki oleh objek yang sama dapat dibandingkan untuk kesetaraan. Untuk ini, kita perlu memiliki metode khusus pada tipe objek yang disebut metode 'ORDER'.
Metode 'ORDER' ini harus berupa fungsi yang mengembalikan tipe numerik. Dibutuhkan dua parameter sebagai input, (parameter pertama: id dari instance objek mandiri, parameter kedua: id dari instance objek lain).
Id dari dua contoh objek dibandingkan, dan hasilnya dikembalikan dalam bentuk numerik.
- Nilai positif menyatakan bahwa instance objek SELF lebih besar dari instance lainnya.
- Nilai negatif menunjukkan bahwa instance objek SELF lebih kecil dari instance lainnya.
- Nol menyatakan bahwa instance objek SELF sama dengan instance lainnya.
- Jika salah satu instance bernilai null, maka fungsi ini akan mengembalikan null.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; —any positive number will do ELSE RETURN 0; END IF; END; . . ); /
Penjelasan Sintaks:
- Sintaks di atas menunjukkan fungsi ORDER yang perlu disertakan dalam badan tipe untuk pemeriksaan kesetaraan.
- Parameter untuk fungsi ini harus berupa turunan dari tipe objek yang sama.
- Fungsi di atas dapat disebut sebagai “obj_instance_1.match(obj_instance_2)” dan ekspresi ini akan mengembalikan nilai numerik seperti yang ditunjukkan, di mana obj_instance_1 dan obj_instance_2 adalah turunan dari object_type_name.
Contoh 1: Dalam contoh berikut kita akan melihat cara membandingkan dua objek. Kita akan membuat dua contoh dan membandingkan atribut 'salary' di antara keduanya. Kita akan melakukan int dalam dua langkah.
- Langkah 1: Membuat tipe dan isi Objek.
- Langkah 2: Membuat blok anonim untuk memanggil perbandingan instance objek.
Langkah 1) Membuat tipe dan isi Objek.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF: END; END; /
Penjelasan Kode:
- Baris kode 1-4: Membuat tipe objek 'emp_object_equality' dengan 1 atribut dan 1 anggota.
- Baris kode 6-16: Menentukan fungsi ORDER yang membandingkan atribut 'salary' dari instance SELF dan tipe instance parameter. Fungsi ini menghasilkan nilai negatif jika gaji SELF lebih rendah atau nilai positif jika gaji SELF lebih tinggi dan nilai 0 jika gaji sama.
Keluaran Kode:
Ketik dibuat
Langkah 2) Membuat blok anonim untuk memanggil membandingkan contoh objek.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equalS(l_obj_2)>0 THEN Dbms_output.put_line(’Salary of first instance is greater’): ELSIF l_obj_l.equalS(l_obj_2)<0 THEN Dbms_output.put_line(’Salary of second instance is greater’); ELSE Dbms_output.put_line(’Salaries are equal’); END IF; END; /
Keluaran
Salary of second instance is greater
Penjelasan Kode:
- Baris kode 20: Mendeklarasikan l_obj_1 dari tipe emp_object_equality.
- Baris kode 21: Mendeklarasikan l_obj_2 dari tipe emp_object_equality.
- Baris kode 23: Menginisialisasi l_obj_1 dengan nilai gaji '15000'
- Baris kode 24: Menginisialisasi l_obj_1 dengan nilai gaji '17000'
- Baris kode 25-33: Cetak pesan berdasarkan nomor pengembalian dari fungsi ORDER.
Kesimpulan
Dalam bab ini, kita telah melihat jenis objek dan propertinya. Kita juga telah membahas tentang Konstruktor, Anggota, Atribut, Warisan dan Kesetaraan pada objek PL/SQL.