PL/SQL Subprograms

8.9.3. Menggunakan Mode IN OUT

Sebuah parameter IN OUT mengijinkan kita melewatkan nilai-nilai awal ke subprogram yang sedang dipanggil dan mengembalikan nilai-nilai yang telah diubah ke pemanggil. Di bagian dalam subprogram tersebut, sebuah parameter IN OUT bertindak seperti halnya sebuah variable terinisialisasi. Sehingga, kita tidak dapat memberikan nilai terhadapnya dan nilainya dapat diberikan ke variable yang lain.

Parameter aktual yang berhubungan dengan parameter formal IN OUT harus berupa sebuah variable; ia tidak dapat berupa sebuah konstanta dan sebuah ekspresi.

Jika kita keluar dari sebuah subprogram secara sukses, PL/SQL memberikan nilai-nilai ke parameter-parameter aktual. Namun, jika kita keluar dengan sebuah unhandled exception, PL/SQL tidak memberikan nilai-nilai ke parameter-parameter aktual tersebut.

8.9.4. Kesimpulan Mode Parameter Subprogram

Berikut ini adalah kesimpulan yang dapat kita ambil dari pembahasan mengenai mode-mode parameter:

1.    IN

  • Merupakan default
  • Melewatkan nilai-nilai ke sebuah subprogram
  • Parameter formal bertindak seperti halnya sebuah konstanta
  • Parameter formal tidak dapat menerima sebuah nilai
  • Parameter aktual dapat berupa sebuah konstanta, variable terinisialisasi, literal, atau ekspresi
  • Parameter aktual dilewatkan dengan referensi (sebuah penunjuk ke nilai yang dilewatkan masuk)

2.    OUT

  • Harus disebutkan
  • Mengembalikan nilai-nilai ke pemanggil
  • Parameter formal bertindak seperti halnya sebuah variable
  • Parameter formal harus diberikan sebuah nilai
  • Parameter aktual harus berupa sebuah variable
  • Parameter aktual dilewatkan dengan nilai (sebuah salinan dari nilai dilewatkan keluar) kecuali jika NOCOPY disebutkan

3.    IN OUT

  • Harus disebutkan
  • Melewatkan nilai-nilai awal ke sebuah subprogram dan mengembalikan nilai-nilai yang telah diubah ke pemanggil
  • Parameter formal bertindak seperti halnya sebuah variable terinisialisasi
  • Parameter formal sebaiknya dapat menerima sebuah nilai
  • Parameter aktual harus berupa sebuah variable
  • Parameter aktual dilewatkan dengan nilai (sebuah salinan dari nilai dilewatkan masuk dan keluar) kecuali NOCOPY disebutkan

8.10. Melewatkan Struktur Data Besar dengan Compiler Hint NOCOPY

Misalkan sebuah subprogram mendeklarasikan sebuah parameter IN, sebuah parameter OUT, dan sebuah parameter IN OUT. Ketika kita memanggil subprogram tersebut, parameter IN dilewatkan dengan referensi. Sebuah penunjuk (pointer) ke parameter aktual IN dilewatkan ke parameter formal yang sesuai. Sehingga, kedua parameter mereferensi (mengacu) kepada lokasi memory yang sama, yang menampung nilai dari parameter aktual.

Secara default, parameter-parameter OUT dan IN OUT dilewatkan dengan nilai. Dengan demikian, nilai dari parameter aktual IN OUT disalin ke parameter formal yang sesuai. Lalu, jika subprogram tersebut keluar secara normal, nilai-nilai yang telah diberikan kepada parameter-parameter formal OUT dan IN OUT disalin ke parameter-parameter aktual yang sesuai.

Ketika parameter-parameter tersebut menangani struktur-struktur data besar seperti halnya collections, records, dan instances dari object types, seluruh proses penyalinan ini memperlambat eksekusi dan menggunakan banyak memory. Untuk mencegahnya, kita dapat menyebutkan hint NOCOPY, yang mengijinkan PL/SQL compiler untuk melewatkan parameter-parameter OUT dan IN OUT berdasarkan referensi.

Dalam contoh berikut ini, kita meminta compiler untuk melewatkan parameter IN OUT my_staff berdasarkan referensi dibandingan berdasarkan nilai:

DECLARE
  TYPE Staff IS VARRAY(200) OF Employee;
  PROCEDURE reorganize (my_staff IN OUT NOCOPY Staff) IS ...

Perlu kita ingat, NOCOPY adalah sebuah hint, bukan sebuah directive (instruksi / perintah). Sehingga, compiler mungkin melewatkan my_staff berdasarkan nilai sesuai permintaan kita. Bagaimanapun, biasanya NOCOPY berhasil. Sehingga, ia dapat mengambil keuntungan dari aplikasi PL/SQL yang melewatkan struktur-struktur data besar.

Dalam contoh di bawah ini, 25000 records dimuat ke sebuah nested table lokal, yang dilewatkan ke dua procedures lokal yang tidak melakukan apapun kecuali mengeksekusi perintah-perintah NULL. Namun, pemanggilan terhadap satu procedure memakan waktu 21 detik disebabkan seluru proses penyalinan. Dengan NOCOPY, pemanggilan ke procedure lain hanya memakan waktu 1 detik.

SQL> SET SERVEROUTPUT ON
SQL> GET test.sql
1 DECLARE
2 TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE;
3 emp_tab EmpTabTyp := EmpTabTyp(NULL); -- initialize
4 t1 NUMBER(5);
5 t2 NUMBER(5);
6 t3 NUMBER(5);
7 PROCEDURE get_time (t OUT NUMBER) IS
8 BEGIN SELECT TO_CHAR(SYSDATE,’SSSSS’) INTO t FROM dual; END;
9 PROCEDURE do_nothing1 (tab IN OUT EmpTabTyp) IS
10 BEGIN NULL; END;
11 PROCEDURE do_nothing2 (tab IN OUT NOCOPY EmpTabTyp) IS
12 BEGIN NULL; END;
13 BEGIN
14 SELECT * INTO emp_tab(1) FROM emp WHERE empno = 7788;
15 emp_tab.EXTEND(24999, 1); -- copy element 1 into 2..25000
16 get_time(t1);
17 do_nothing1(emp_tab); -- pass IN OUT parameter
18 get_time(t2);
19 do_nothing2(emp_tab); -- pass IN OUT NOCOPY parameter
20 get_time(t3);
21 dbms_output.put_line(’Call Duration (secs)’);
22 dbms_output.put_line(’--------------------’);
23 dbms_output.put_line(’Just IN OUT: ’ || TO_CHAR(t2 - t1));
24 dbms_output.put_line(’With NOCOPY: ’ || TO_CHAR(t3 - t2));
25* END;
SQL> /
Call Duration (secs)
--------------------
Just IN OUT: 21
With NOCOPY: 0

 

 

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