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.

Tipe Objek di PL/SQL

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.

  1. atribut
  2. 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.

Buat Objek di OracleBuat Objek di Oracle

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.

Inisialisasi Deklarasi Tipe Objek

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.

Inisialisasi Deklarasi 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

Konstruktor

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);
/

Konstruktor

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

Konstruktor

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

Konstruktor

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.

Warisan dalam Tipe Objek

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Penjelasan Sintaks:

  • Sintaks di atas menunjukkan pembuatan tipe SUPER.

Warisan dalam Tipe Objek

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.

Warisan dalam 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(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.

Warisan dalam Tipe Objek

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

Warisan dalam Tipe Objek

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.

Kesetaraan Objek PL/SQL

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.

Kesetaraan Objek PL/SQL

Kesetaraan Objek PL/SQL

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.

Kesetaraan Objek PL/SQL

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.