PL/SQL Object Types
10.10. Memanggil Constructor
Pemanggilan kepada sebuah constructor diperbolehkan dimanapun pemanggilan function diperbolehkan. Seperti halnya semua functions, sebuah constructor dipanggil sebagai bagian dari sebuah ekspresi, seperti ditunjukkan oleh contoh berikut ini:
DECLARE
r1 Rational := Rational(2, 3);
FUNCTION average (x Rational, y Rational) RETURN Rational IS
BEGIN
...
END;
BEGIN
r1 := average(Rational(3, 4), Rational(7, 11));
IF (Rational( 5, 8 ) > r1) THEN
...
END IF;
END;
Ketika kita melewatkan parameter-parameter ke sebuah constructor, pemanggilan memberikan nilai-nilai awal kepada attributes dari objek yang sedang dimulai. Ketika kita memanggil constructor default tersebut untuk mengisi kepada seluruh nilai-nilai attribute, kita harus menyediakan sebuah parameter untuk setiap attribute; tidak seperti constants dan variables, attributes tidak dapat memiliki nilai-nilai default. Seperti ditunjukkan oleh contoh di bawah ini, parameter ke-n memberikan sebuah nilai kepada attribute ke-n:
DECLARE r Rational; BEGIN r := Rational(5, 6); -- assign 5 to num, 6 to den -- now r is 5/6
Contoh berikutnya menunjukkan bahwa kita dapat memanggil sebuah constructor dengan menggunakan notasi nama dibandingkan dengan notasi posisi:
BEGIN r := Rational(den => 6, num => 5); -- assign 5 to num, 6 to den
10.11. Memanggil Methods
Seperti halnya packaged subprograms, methods dipanggil dengan menggunakan notasi titik. Di dalam contoh berikut ini, kita memanggil method normalize(), yang membagi attributes num dan den (untuk “numerator” dan “denominator”) dengan pembagi umum terbesar mereka:
DECLARE r Rational; BEGIN r := Rational(6, 8); r.normalize; dbms_output.put_line(r.num); -- prints 3 END;
Seperti ditunjukkan oleh contoh di bawah ini, kita dapat merangkai pemanggilan method. Eksekusi dijalankan dari kiri ke kanan. Pertama member function reciprocal() dipanggil, kemudian member procedure normalize() dipanggil.
DECLARE r Rational := Rational(6, 8); BEGIN r.reciprocal().normalize; dbms_output.put_line(r.num); -- prints 4 END;
Di dalam perintah-perintah SQL, pemanggilan kepada sebuah method tak berparameter membutuhkan sebuah daftar parameter kosong. Di dalam perintah-perintah procedural, sebuah daftar parameter kosong bersifat opsional kecuali kita merangkai pemanggilan, yang mana itu dibutuhkan untuk seluruh pemanggilan kecuali yang terakhir.
Kita tidak dapat merangkai pemanggilan method tambahan ke sebelah kanan dari sebuah pemanggilan procedure karena sebuah procedure dipanggil sebagai sebuah perintah, tidak sebagai bagian dari sebuah ekspresi. Sebagai contoh, perintah berikut ini tidak diperbolehkan:
r.normalize().reciprocal; -- not allowed
Juga, jika kita merangkai pemanggilan function, function pertama harus menghasilkan sebuah objek yang dapat dilewatkan kepada function kedua.
Untuk method-method statis, pemanggilan menggunakan notasi type_name.method_name dibandingkan dengan menentukan sebuah instance dari type tersebut.
Ketika kita memanggil sebuah method dengan menggunakan sebuah instance dari sebuah subtype, actual method yang dieksekusi bergantung kepada deklarasi sebenarnya di dalam hirarki type tersebut. Jika subtype tersebut mengesampingkan method yang diturunkannya dari supertype-nya, maka pemanggilan menggunakan implementasi subtype. Atau, jika subtype tersebut tidak mengesampingkan method, maka pemanggilan menggunakan implementasi supertype. Kemampuan ini disebut dengan dynamic method dispatch.
10.12. Sharing Object Melalui REF Modifier
Kebanyakan objek-objek dunia nyata lebih besar dan lebih kompleks dibandingkan dengan objek-objek dari type Rational. Ketika sebuah objek adalah besar, maka tidaklah efisien untuk melewatkan duplikatnya dari subprogram ke subprogram. Menjadi sangat masuk akal untuk berbagi objek tersebut. Kita dapat melakukannya jika objek tersebut memiliki sebuah pengidentifikasi objek. Untuk berbagi objek, kita menggunakan referensi (refs untuk singkatnya). Sebuah ref merupakan sebuah penunjuk (pointer) kepada sebuah objek.
Berbagi memiliki dua keuntungan penting. Pertama, data tidak direplikasi secara tidak perlu. Kedua, ketika sebuah objek yang digunakan bersama-sama tersebut di-update, perubahan hanya terjadi di satu tempat, dan suatu ref dapat menampilkan perubahan nilai-nilai tersebut secara langsung.
Di dalam contoh berikut ini, kita memperoleh manfaat dari sharing (berbagi) dengan mendefinisikan object type Home dan kemudian menciptakan sebuah table yang menyimpan instances dari object type-nya:
CREATE TYPE Home AS OBJECT ( address VARCHAR2(35), owner VARCHAR2(25), age INTEGER, style VARCHAR(15), floor plan BLOB, price REAL(9,2), ... ); / CREATE TABLE homes OF Home;
Dengan meninjau kembali object type Person, kita dapat memodelkan keluarga-keluarga, dimana beberapa orang berbagi tempat tinggal yang sama. Kita menggunakan type modifier REF untuk mendeklarasikan refs, yang menggenggam penunjuk-penunjuk (pointers) ke objek-objek tersebut:
CREATE TYPE Person AS OBJECT ( first_name VARCHAR2(10), last_name VARCHAR2(15), birthday DATE, home_address REF Home, -- can be shared by family phone_number VARCHAR2(15), ss_number INTEGER, mother REF Person, -- family members refer to each other father REF Person, ... );
Perhatikan bagaimana referensi dari orang-orang ke tempat tinggal dan diantara orang-orang memodelkan hubungan-hubungan dunia nyata.
Kita dapat mendeklarasikan refs sebagai variables, parameters, fields, atau attributes. Dan, kita dapat menggunakan refs sebagai input atau output variables di dalam perintah-perintah SQL data manipulation. Namun, kita tidak dapat berpindah diantara refs. Ekspresi yang diberikan seperti halnya x.attribute, dimana x merupakan sebuah ref, PL/SQL tidak dapat berpindah ke table dimana objek yang direferensi tersebut tersimpan. Sebagai contoh, pemberian nilai berikut ini tidak diperbolehkan:
DECLARE p_ref REF Person; phone_no VARCHAR2(15); BEGIN phone_no := p_ref.phone_number; -- not allowed
Sebaliknya, kita harus menggunakan function DEREF atau melakukan pemanggilan kepada package UTL_REF untuk mengakses objek tersebut.
10.12.1. Forward Types Definitions
Kita dapat mengacu hanya ke schema objects yang telah ada. Di dalam contoh berikut, perintah CREATE TYPE yang pertama tidak diperbolehkan karena ia mengacu kepada object type Department, yang mana belum ada:
CREATE TYPE Employee AS OBJECT ( name VARCHAR2(20), dept REF Department, -- not allowed ... ); CREATE TYPE Department AS OBJECT ( number INTEGER, manager Employee, ... );
Penggantian perintah-perintah CREATE TYPE tidak membantu karena object types bersifat mutually dependent. Object type Employee memiliki sebuah attribute yang mereferensi kepada object type Department, dan object type Department memiliki sebuah attribute dengan type Employee. Untuk memecahkan masalah ini, kita menggunakan sebuah perintah CREATE TYPE khusus yang disebut dengan sebuah forward type definition, yang mana mengijinkan kit auntuk mendefinisikan mutually dependent object types.
Untuk men-debug contoh terakhir, secara sederhana awali dengan perintah berikut:
CREATE TYPE Department; -- forward type definition -- at this point, Department is an incomplete object type
Object type yang diciptakan dengan sebuah forward type definition disebut dengan incomplete object type karena (sampai ia didefinisikan secara penuh) ia tidak memiliki attributes dan methods.
Sebuah impure incomplete object type memiliki attributes namun menyebabkan compilation errors karena ia mengacu kepada sebuah type tak terdefinisikan. Sebagai contoh, perintah CREATE TYPE berikut ini menyebabkan error karena object type Address tidak terdefinisikan:
CREATE TYPE Customer AS OBJECT ( id NUMBER, name VARCHAR2(20), addr Address, -- not yet defined phone VARCHAR2(15) );
Hal ini mengijinkan kita untuk menangguhkan definisi object type Address. Selain itu, incomplete type Customer dapat dibuat tersedia untuk application developers lain untuk digunakan di dalam refs.
| 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 dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Silahkan melanjutkan membaca pembahasan PL/SQL Object Types […]