PL/SQL Subprograms
8.14.1. Bagaimana Overloading Bekerja dengan Inheritance
Algoritma overloading mengijinkan penggantian sebuah nilai subtype untuk sebuah parameter formal yang merupakan sebuah supertype. Kemampuan ini dikenal dengan substitutability. Jika lebih dari satu instance dari sebuah overloaded procedure sesuai dengan pemanggilan procedure tersebut, aturan-aturan berikut ini diterapkan untuk menentukan procedure mana yang dipanggil.
Jika satu-satunya perbedaan dalam hal signature dari overloaded procedures adalah bahwa beberapa parameter adalah object types dari hirarki subtype-subtype yang sama, kesesuaian yang terdekat digunakan. Kesesuaian terdekat adalah satu dimana seluruh parameter paling tidak sedekat mungkin dengan overloaded instance yang lain, seperti ditentukan oleh kedalaman dari inheritance diantara subtype dengan supertype, dan paling tidak satu parameter lebih dekat.
Sebuah semantic error muncul ketika dua overloaded instances sesuai, dan beberapa tipe-tipe argumen lebih dekat dalam satu overloaded procedure kepada argumen-argumen aktual daripada di dalam instance yang lain.
Sebuah semantic error juga muncul jika beberapa parameter berbeda dalam hal posisinya di dalam hirarki object type, dan parameter-parameter lain dari tipe-tipe data yang berbeda sehingga sebuah konversi implisit akan diperlukan.
Sebagai contoh, disini kita menciptakan sebuah hirarki type dengan 3 level:
CREATE TYPE super_t AS object (n NUMBER) NOT final; CREATE OR replace TYPE sub_t under super_t (n2 NUMBER) NOT final; CREATE OR replace TYPE final_t under sub_t (n3 NUMBER);
Kita mendeklarasikan dua overloaded instances dari sebuah function, dimana perbedaan satu-satunya di dalam tipe-tipe argument adalah posisi mereka di dalam tipe hirarki ini:
CREATE PACKAGE p IS FUNCTION foo (arg super_t) RETURN NUMBER; FUNCTION foo (arg sub_t) RETURN NUMBER; END; / CREATE PACKAGE BODY p IS FUNCTION foo (arg super_t) RETURN NUMBER IS BEGIN RETURN 1; END; FUNCTION foo (arg sub_t) RETURN NUMBER IS BEGIN RETURN 2; END; END; /
Kita mendeklarasikan variable dengan tipe final_t, kemudian memanggil overloaded function tersebut. Instance dari function tersebut, yang dieksekusi adalah satu-satunya yang meneripa sebuah parameter sub_t, karena tipe tersebut lebih dekat ke final_t di dalam hirarki dibandingkan dengan super_t.
SQL> set serveroutput on SQL> declare v final_t := final_t(1,2,3); begin dbms_output.put_line(p.foo(v)); end; / 2
Dalam contoh sebelumnya, pilihan instance mana yang dipanggil dibuat pada waktu kompilasi. Dalam contoh berikut ini, pilihannya dibuat secara dinamis.
CREATE TYPE super_t2 AS object (n NUMBER, MEMBER FUNCTION foo RETURN NUMBER) NOT final; / CREATE TYPE BODY super_t2 AS MEMBER FUNCTION foo RETURN NUMBER IS BEGIN RETURN 1; END; END; / CREATE OR replace TYPE sub_t2 under super_t2 (n2 NUMBER, OVERRIDING MEMBER FUNCTION foo RETURN NUMBER) NOT final; / CREATE TYPE BODY sub_t2 AS OVERRIDING MEMBER FUNCTION foo RETURN NUMBER IS BEGIN RETURN 2; END; END; / CREATE OR replace TYPE final_t2 under sub_t2 (n3 NUMBER); /
Kita mendeklarasikan v sebagai sebuah instance dari super_t2, namun karena kita memberikan sebuah nilai dari sub_t2 terhadapnya, instance yang tepat dari function tersebut yang dipanggil. Fitur ini disebut dengan dynamic dispatch.
SQL> set serveroutput on declare v super_t2 := final_t2(1,2,3); begin dbms_output.put_line(v.foo); end; / 2
| 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) |
Comments
[…] Klausa AUTHID menentukan apakah seluruh subprogram-subprogram ter-package dijalankan dengan privileges dari definer (default) atau invoker-nya, dan apakah referensi tak terkualifikasi dari mereka terhadap schema objects ditetapkan di dalam schema dari definer atau invoker tersebut. Untuk informasi lebih, kita dapat membaca kembali pembahasan PL/SQL Subprograms. […]


[…] PL/SQL Subprograms | Hastinapura […]