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:

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 dsb. Harga Rp. 24.800,- (157 halaman)

 

Related Articles

 

Comments

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

[…] Silahkan melanjutkan membaca pembahasan PL/SQL Subprograms […]

[…] 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. […]

[…] Dynamic SQLPL/SQL Object TypesPL/SQL PackagesPL/SQL SubprogramsInteraksi PL/SQL dengan […]

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word