PL/SQL Subprograms
8.4.2. Mengontrol Efek Samping dari PL/SQL Subprograms
Untuk menjadi dapat dipanggil dari perintah-perintah SQL, sebuah stored function harus mematuhi aturan-aturan “kemurnian” berikut ini, yang dimaksudkan untuk mengontrol efek samping:
- Ketika dipanggil dari sebuah perintah SQL atau perintah-perintah INSERT, UPDATE, atau DELETE terparallel, function tersebut tidak dapat mengubah database tables.
- Ketika dipanggil dari perintah INSERT, UPDATE, atau DELETE, function tidak dapat melakukan query atau memodifikasi database tables yang dimodifikasi oleh perintah tersebut.
- Ketika dipanggil dari perintah SELECT, INSERT, UPDATE, atau DELETE, function tidak dapat mengekseksekusi perintah-perintah pengontrol transaksi SQL (seperti COMMIT), perintah-perintah pengontrol session (seperti SET ROLE), atau perintah-perintah pengontrol sistem (seperti ALTER SYSTEM). Juga, ia tidak dapat mengeksekusi perintah-perintah DDL (seperti CREATE) karena perintah-perintah tersebut diikuti oleh commit otomatis.
Jika suatu perintah SQL di dalam tubuh function (body) menyalahi sebuah aturan, kita mendapatkan error saat runtime (ketika perintah tersebut di-parse).
Untuk memeriksa pelanggaran aturan, kita dapat menggunakan pragma (compiler directive) RESTRICT_REFERENCES. Pragma tersebut menegaskan bahwa sebuah function tidak membaca dan/atau menulis database tables dan/atau package variables.
Sebagai contoh, pragma berikut ini menegaskan bahwa function terpackage credit_ok tidak menulis database state (WNDS (Writes No Database State)) dan tidak membaca package state (RNPS (Reads No Database State)):
CREATE PACKAGE loans AS ... FUNCTION credit_ok RETURN BOOLEAN; PRAGMA RESTRICT_REFERENCES (credit_ok, WNDS, RNPS); END loans;
Catatan: Perintah statis INSERT, UPDATE, atau DELETE selalu melanggar WNDS. Ia juga melanggar RNPS (reads no database state) jika ia membaca suatu kolom. Perintah dinamis INSERT, UPDATE, atau DELETE selalu melanggar WNDS dan RNDS.
8.5. Mendeklarasikan PL/SQL Subprograms
Kita dapat mendeklarasikan subprograms didalam suatu PL/SQL block, subprogram, atau package. Namun, kita harus mendeklarasikan subprograms pada akhir dari sebuah bagian declarative setelah seluruh item-item program yang lain.
PL/SQL memerlukan bahwa kita harus mendeklarasikan sebuah identifier sebelum menggunakannya. Sehingga, kita harus mendeklarasikan sebuah subprogram sebelum memanggilnya. Sebagai contoh, deklarasi dari procedure award_bonus berikut ini tidak diperbolehkan karena award_bonus memanggil procedure calc_rating, yang belum dideklarasikan sebelum pemanggilan dilakukan:
DECLARE ... PROCEDURE award_bonus IS BEGIN calc_rating(...); -- undeclared identifier ... END; PROCEDURE calc_rating (...) IS BEGIN ... END;
Dalam kasus ini, kita dapat membenarkan problem tersebut secara mudah dengan menempatkan procedure calc_rating sebelum procedure award_bonus. Namun, solusi yang mudah tidak selalu dapat bekerja. Sebagai contoh, misalkan procedures tersebut mutually recursive (saling memanggil satu sama lain) atau kita ingin mendefinisikan mereka di dalam urutan logikal atau alphabetic.
Kita dapat menyelesaikan masalah tersebut dengan menggunakan deklarasi subprogram khusus yang disebut dengan forward declaration, yang terdiri dari sebuah subprogram spec yang diakhiri dengan tanda titik koma. Dalam contoh berikut ini, forward declaration tersebut memberitahu PL/SQL bahwa body dari procedure calc_rating dapat ditemukan belakangan di dalam block tersebut.
DECLARE PROCEDURE calc_rating ( ... ); -- forward declaration ...
Meskipun daftar parameter formal muncul di dalam forward declaration, ia juga harus muncul di dalam body dari subprogram tersebut. Kita bisa menempatkan body dari subprogram dimanapun setelah forward declaration, namun mereka harus berada di dalam program unit yang sama.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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. |


































