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
| 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. |


































