PL/SQL Subprograms

8.10.1. Trade-Off untuk Performa Lebih Baik dengan NOCOPY

NOCOPY mengijinkan kita untuk mendapatkan keuntungan dari semantik-semantik exception yang terdefinisi dengan baik untuk performa lebih baik. Penggunaannya mempengaruhi exception handling dengan cara-cara sebagai berikut:

  • Karena NOCOPY adalah sebuah hint, bukan sebuah directive, compiler dapat melewatkan parameter-parameter NOCOPY ke sebuah subprogram berdasarkan nilai atau berdasarkan referensi. Sehingga, jika subprogram tersebut keluar dengan sebuah unhandled exception, kita tidak dapat mengandalkan nilai-niali dari parameter-parameter aktual NOCOPY.
  • Secara default, jika sebuah subprogram keluar dengan sebuah unhandled exception, nilai-nilai yang diberikan ke parameter-parameter formal IN dan IN OUT –nya tidak disalin ke parameter-parameter aktual yang sesuai, dan perubahan-perubahan yang nampak di-rollback. Namun, ketika kita menyebutkan NOCOPY, pemberikan nilai ke parameter-parameter formal tersebut secara segera berpengaruh terhadap parameter-parameter aktual. Sehingga, jikga subprogram tersebut keluar dengan sebuah unhandled exception, perubahan-perubahan (kemungkinan tidak terselesaikan) tidak dilakukan ”rollback”.
  • Saat ini, protokol RPC mengijinkan kita untuk melewatkan parameter-paramete hanya berdasarkan nilainya. Sehingga, semantik-semantik dari exception dapat berubah dengan diam ketika kita mempartisi aplikasi. Sebagai contoh, jika kita memindahkan sebuah procedure lokal dengan parameter-parameter NOCOPY ke sebuah remote site, parameter-parameter itu tidak lagi dilewatkan berdasarkan referensi.

Penggunaan NOCOPY meningkatkan kemungkinan pengaliasan parameter. Hal ini akan kita bahas dalam bab tersendiri.

8.10.2. Batasan-batasan NOCOPY

Dalam kasus-kasus berikut ini, PL/SQL compiler mengabaikan hint NOCOPY dan menggunakan metode pelewatan-parameter berdasarkan-nilai (tidak ada error yang dihasilkan):

  • Parameter aktual adalah sebuah elemen dari sebuah index-by table. Batasan ini tidak berlaku terhadap keseluruhan index-by tables.
  • Parameter aktual memiliki aturan (berdasarkan skala atau NOT NULL, misalnya). Batasan ini tidak memperpanjang ke elemen-elemen atau atribut-atribut yang memiliki constraint. Juga, ia tidak diterapkan ke string-string karakter yang memiliki batasan ukuran.
  • Parameter-parameter aktual dan formal adalah records, satu atau kedua records dideklarasikan menggunakan %ROWTYPE atau %TYPE, dan constraint-constraint pada field-field terkait di dalam records adalah berbeda.
  • Melewatkan parameter aktual memerlukan satu konversi tipe data secara implisit.
  • Subprogram dibutuhkan di dalam sebuah pemanggilan procedure eksternal atau remote.

8.11. Menggunakan Nilai-nilai Default untuk Parameter-parameter Subprogram

Seperti ditunjukkan oleh contoh di bawah ini, kita dapat menginisialiasai parameter-parameter IN ke nilai-nilai default. Dengan begitu, kita dapat melewatkan jumlah parameter-parameter aktual yang berbeda ke sebuah subprogram, menerima atau menolak nilai-nilai default sesuai yang kita kehendaki. Lebih jauh lagi, kita dapat menambahkan parameter-parameter formal baru tanpa harus mengubah setiap pemanggilan ke subprogram tersebut.

PROCEDURE create_dept (
new_dname VARCHAR2 DEFAULT 'TEMP',
new_loc VARCHAR2 DEFAULT 'TEMP') IS
BEGIN
  INSERT INTO dept
  VALUES (deptno_seq.NEXTVAL, new_dname, new_loc);
  ...
END;

Jika sebuah parameter aktual tidak dilewatkan, nilai default dari parameter formal terkaitnya yang akan digunakan. Mari kita perhatikan pemanggilan terhadap create_dept berikut ini:

create_dept;
create_dept('MARKETING');
create_dept('MARKETING', 'NEW YORK');

Pemanggilan pertama tidak melewatkan parameter-parameter aktual, sehingga kedua nilai default digunakan. Pemanggilan kedua melewatkan satu parameter aktual, sehingga nilai defualt untuk new_log digunakan. Pemanggilan ketiga melewatkan dua parameter-parameter aktual, sehingga tidak ada nilai default yang digunakan.

Biasanya, kita dapat menggunakan notasi posisi untuk menolak nilai default dari parameter-parameter formal. Namun, kita tidak dapat melompati sebuah parameter formal bendan meninggalkan parameter aktualnya. Sebagai contoh, pemanggilan berikut ini secara salah menghubungkan parameter aktual ‘NEW YORK’ dengan parameter formal new_dname:

create_dept('NEW YORK'); -- salah

Kita tidak dapat menyelesaikan masalah dengan meninggalkan sebuah placeholder untuk parameter aktual tersebut. Sebagai contoh, pemanggilan berikut ini tidak diperbolehkan:

create_dept(, 'NEW YORK'); -- tidak diperbolehkan

Dalam kasus seperti ini, kita harus menggunakan notasi bernama, seperti contoh berikut ini:

create_dept(new_loc => 'NEW YORK');

Kita juga tidak dapat memberikan sebuah null ke parameter formal tak terinisialisasi dengan meninggalkan parameter aktualnya. Sebagai contoh deklarasi berikut ini

DECLARE
FUNCTION gross_pay (
emp_id IN NUMBER,
st_hours IN NUMBER DEFAULT 40,
ot_hours IN NUMBER) RETURN REAL IS
BEGIN
  ...
END;

pemanggilan function berikut ini tidak memberikan sebuah null ke ot_hours:

IF gross_pay(emp_num) > max_pay THEN ... -- tidak diperbolehkan

Sebaliknya, kita harus melewatkan null tersebut secara eksplisit, seperti di dalam

IF gross_pay(emp_num, ot_hour => NULL) > max_pay THEN ...

atau kita dapat menginisialisasi ot_hours ke NULL, seperti berikut

ot_hours IN NUMBER DEFAULT NULL;

Akhirnya, ketika menciptakan sebuah stored procedure, kita tidak dapat mengunakan host variables (bind variables) di dalam klausa DEFAULT. Contoh SQL*Plus berikut ini menyebabkan sebuah error bad bind variable karena pada saat penciptaan, num hanya merupakan sebuah placeholder dimana nilainya dapat berubah:

SQL> VARIABLE num NUMBER
SQL> CREATE FUNCTION gross_pay (emp_id IN NUMBER DEFAULT :num, ...

 

 

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


Bookmark and Share

 

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.

 

Find Related articles