PL/SQL Object Types
10.5.2.3. Overloading
Seperti halnya packaged subprograms, methods dengan jenis yang sama (functions atau procedures) dapat di-overload. Dengan demikian, kita dapat menggunakan nama yang sama untuk methods yang berbeda jika parameter-parameter formal mereka berbeda dalam hal jumlah, urutan, atau keluarga tipe data. Ketika kita memanggil satu dari methods tersebut, PL/SQL menemukannya dengan membandingkan daftar dari parameter-parameter aktual dengan setiap daftar dari parameter-parameter formal.
Sebuah subtype dapat juga meng-overload methods yang ia turunkan dari supertype-nya. Dalam kasus ini, methods tersebut dapat memiliki parameter-parameter formal yang tepat sama.
Kita tidak dapat meng-overload dua methods jika parameter-parameter formal mereka berbeda hanya dalam hal mode parameter. Juga, kita tidak dapat meng-overload dua functions anggota yang berbeda hanya dalam hal tipe hasil (return type).
10.5.2.4. MAP dan ORDER Methods
Nilai-nilai dari sebuah tipe data scalar seperti CHAR atau REAL memiliki sebuah predefined order, yang mengijinkan mereka untuk dibandingkan. Namun instances dari sebuah object type tidak memiliki predefined order. Untuk meletakkan mereka dalam urutan untuk tujuan perbandingan atau pengurutan, PL/SQL memanggil sebuah MAP method yang kita sediakan. Dalam contoh berikut ini, keyword MAP mengindikasikan bahwa method convert () mengurutkan objek-objek Rational dengan cara memetakan mereka kepada nilai-nilai REAL:
CREATE TYPE Rational AS OBJECT ( num INTEGER, den INTEGER, MAP MEMBER FUNCTION convert RETURN REAL, ... ); CREATE TYPE BODY Rational AS MAP MEMBER FUNCTION convert RETURN REAL IS BEGIN RETURN num / den; END convert; ... END;
PL/SQL menggunakan pengurutan untuk mengevaluasi ekspresi-ekspresi Boolean seperti x > y, dan untuk melakukan perbandingan-perbandingan yang diakibatkan oleh klausa-klausa DISTINCT, GROUP BY, dan ORDER BY. MAPmethodconvert() menghasilkan posisi relatif dari sebuah object dalam urutan dari seluruh objek-objek Relational.
Sebuah object type dapat terdiri dari hanya satu MAP method. Ia menerima built-in parameter SELF dan menghasilkan satu dari tipe-tipe scalar berikut: DATE, NUMBER, VARCHAR2, atau sebuah tipe ANSI seperti halnya CHARACTER atau REAL.
Alternatifnya, kita dapat menyediakan PL/SQL dengan ORDER method. Sebuah object type dapat mengandung hanya satu ORDER method, yang mana merupakan sebuah function yang mengembalikan sebuah hasil numerik. Dalam contoh berikut ini, keyword ORDER mengindikasikan bahwa method match() membandingkan dua objek:
CREATE TYPE Customer AS OBJECT ( id NUMBER, name VARCHAR2(20), addr VARCHAR2(30), ORDER MEMBER FUNCTION match (c Customer) RETURN INTEGER ); CREATE TYPE BODY Customer AS ORDER MEMBER FUNCTION match (c Customer) RETURN INTEGER IS BEGIN IF id < c.id 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; END;
Setiap ORDER method megambil hanya dua parameter: yaitu built-in parameter SELF dan objek lain dengan tipe yang sama. Jika c1 dan c2 merupakan objek-objek Customer, sebuah perbandingan seperti halnya c1 > c2 akan memanggil method match secara otomatis. Method tersebut mengembalikan sebuah angka negatif, nol, atau sebuah angka positif yang menandakan bahwa SELF adalah kurang dari, sama dengan, atau lebih besar dari parameter yang lain. Jika salah satu parameter yang dilewatkan ke ORDER method adalah null, maka method tersebut akan mengembalikan sebuah null.
Penggunaan Sebuah MAP method, berlaku seperti sebuah hash function, memetakan nilai-nilai objek ke dalam nilai-nilai scalar, yang kemudian dibandingkan dengan menggunakan operator seperti <, =, dan seterusnya. Sebuah ORDER method secara sederhana membandingkan satu nilai objek dengan lainnya.
Kita dapat mendeklarasikan sebuah MAP method atau sebuah ORDER method namun tidak keduanya. Jika kita mendeklarasikan salah satu method, kita dapat membandingkan objek-objek di dalam perintah-perintah SQL dan procedural. Namun, jika kita tidak mendeklarasikannya, kita dapat memandingkan objek-objek hanya di dalam perintah-perintah SQL dan hanya untuk persamaan atau pertidaksamaan. (Dua objek dari tipe yang sama adalah sama dengan, jika nilai-nilai dari attributes-nya adalah sama).
Ketika proses pengurutan dan penggabungan sebuah objek-objek dengan jumlah yang besar, kita menggunakan sebuah MAP method. Satu pemanggilan memetakan seluruh objek-objek tersebut ke dalam scalars, kemudian mengurutkan scalars tersebut. Sebuah ORDER method kurang efisien dikarenakan ia harus dipanggil secara berulang kali (ia hanya dapat membandingkan dua objek pada sekali waktu). Kita harus menggunakan MAP method untuk melakukan hash joins karena PL/SQL melakukan hash pada nilai objek tersebut.
10.5.2.5. Constructor Methods
Setiap object type memiliki constructor method (constructor untuk singkatnya), yang merupakan sebuah function dengan nama yang sama seperti object type yang menginisialisasi dan mengembalikan sebuah instance baru dari object type tersebut.
Oracle membangkitkan sebuah default constructor untuk setiap object type, dengan parameter-parameter formal yang sesuai dengan attributes dari object type tersebut. Yaitu, parameters dan attributes dideklarasikan di dalam urutan yang sama dan memiliki nama-nama dan tipe-tipe data yang sama.
Kita dapat mendefinisikan constructor methods kita sendiri, baik dengan mengesampingkan (overriding) sebuah system-defined constructor, atau mendefinisikan sebuah function baru dengan sebuah signature yang berbeda.
PL/SQL tidak pernah memanggil sebuah constructor secara implisit, jadi kita harus memanggilnya secara eksplisit.
10.5.3. Mengubah Attributes dan Methods dari Sebuah Object Type yang Telah Ada (Type Evolution)
Kita dapat menggunakan perintah ALTER TYPE untuk menambahkan, memodifikasi, atau menghapus attributes, dan menambahkan atau menghapus methods dari sebuah object type yang telah ada:
CREATE TYPE Person_typ AS OBJECT ( name CHAR(20), ssn CHAR(12), address VARCHAR2(100)); CREATE TYPE Person_nt IS TABLE OF Person_typ; CREATE TYPE dept_typ AS OBJECT ( mgr Person_typ, emps Person_nt); CREATE TABLE dept OF dept_typ; -- Add new attributes to Person_typ and propagate the change -- to Person_nt and dept_typ ALTER TYPE Person_typ ADD ATTRIBUTE (picture BLOB, dob DATE) CASCADE NOT INCLUDING TABLE DATA; CREATE TYPE mytype AS OBJECT (attr1 NUMBER, attr2 NUMBER); ALTER TYPE mytype ADD ATTRIBUTE (attr3 NUMBER), DROP ATTRIBUTE attr2, ADD ATTRIBUTE attr4 NUMBER CASCADE;
Ketika sebuah procedure di-compile, ia selalu menggunakan version terkini dari object type yang direferensinya. Procedures yang telah ada di server yang mereferensi sebuah object type tidak valid ketika type tersebut di-alter, dan secara otomatis di-compile ulang pada saat pemanggilan procedure tersebut berikutnya. Kita harus meng-compile ulang procedures pada sisi client yang mereferensi types yang di-alter.
Jika kita menghapus method dari sebuah supertype, kita mungkin harus melakukan perubahan terhadap subtypes yang menimpa method tersebut. Kita dapat menemukan apakah ada subtypes yang terpengaruh dengan menggunakan opsi CASCADE pada ALTER TYPE; perintah tersebut di-rollback jika terdapat subtypes yang menimpa method tersebut. Agar berhasil menghapus method dari supertype, kita dapat:
- Meghapus method tersebut secara permanen dari subtype-nya terlebih dahulu.
- Menghapus method tersebut di dalam subtype, kemudian menambahkannya kembali kemudian dengan menggunakan ALTER TYPE tanpa keyword OVERRIDING.
Pages: 1 2 3 4 5 6 7 8 9 10 11
| 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, Uranus dsb. |


































