PL/SQL Subprograms

8.12. Memahami Pengaliasan Parameter Subprogram

Untuk mengoptimasi sebuah pemanggilan subprogram, PL/SQL compiler dapat memilih diantara dua metode untuk melewatkan parameter. Dengan metode by-value, nilai dari sebuah parameter aktual dilewatkan ke subprogram. Dengan metode by-reference, hanya sebuah pointer ke nilai tersebut yang dilewatkan, dimana dalam kasus yang mana parameter-parameter aktual dan formal mereferensi terhadap item yang sama.

Compiler hint NOCOPY meningkatkan kemungkinan dari pengaliasan (yaitu, memiliki nama-nama berbeda yang mereferensi terhadap lokasi memori yang sama). Hal ini dapat terjadi ketika sebuah variable global muncul sebagai sebuah parameter aktual di dalam sebuah pemanggilan subprogram dan kemudian direferensi di dalam subprogram tersebut. Hasilnya tidak dapat ditentukan karena ia bergantung kepada metode dari pelewatan parameter yang dipilih oleh compiler.

Dalam contoh berikut ini, procedure add_entry mereferensi kepada varray lexicon dalam dua cara berbeda: sebagai sebuah parameter dan sebagai sebuah global variable. Sehingga, ketika add_entry dipanggil, identifier word_list dan lexicon menamai varray yang sama.

DECLARE
  TYPE Definition IS RECORD (
  word VARCHAR2(20),
  meaning VARCHAR2(200));
  TYPE Dictionary IS VARRAY(2000) OF Definition;
  lexicon Dictionary := Dictionary();
  PROCEDURE add_entry (word_list IN OUT NOCOPY Dictionary) IS
BEGIN
  word_list(1).word := 'aardvark';
  lexicon(1).word := 'aardwolf';
END;
BEGIN
  lexicon.EXTEND;
  add_entry(lexicon);
  dbms_output.put_line(lexicon(1).word);
  -- menampilkan 'aardvark' jika parameter dilewatkan berdasarkan nilai
  -- menampilkan 'aardwolf' jika parameter dilewatkan berdasarkan referensi
END;

Hasilnya bergantung kepada metode pelewatan parameter yang dipilih oleh compiler. Jika compiler memilik metode by-value, word_list dan lexicon adalah duplikat terpisah dari varray yang sama. Sehingga, mengubah satu tidak berpengaruh terhadap yang lain. Namun, jika compiler memilih metode by-reference, word_list dan lexicon hanyalah nama-nama yang berbeda dari varray yang sama. (Oleh sebab itu, istilahnya adalah “pengaliasan”.) Sehingga, perubahan nilai dari lexicon(1) juga mengubah nilai dari word_list(1).

Pengaliasan dapat terjadi ketika parameter aktual yang sama muncul lebih dari sekali di dalam sebuah pemanggilan subprogram. Dalam contoh di bawah ini, n2 adalah sebuah parameter IN OUT, sehingga nilai dari parameter aktual tidak diubah sampai procedure selesai (exit). Inilah mengapa put_line pertama mencetak 10 (nilai awal dari n) dan put_line ketiga mencetak 20. Namun, n3 adalah sebuah parameter NOCOPY, sehingga nilai dari parameter aktualnya diubah secara segera. Inilah mengapa put_line kedua mencetak 30.

DECLARE
  n NUMBER := 10;
PROCEDURE do_something (n1 IN NUMBER, n2 IN OUT NUMBER,
n3 IN OUT NOCOPY NUMBER) IS
BEGIN
  n2 := 20;
  dbms_output.put_line(n1); -- menampilkan 10
  n3 := 30;
  dbms_output.put_line(n1); -- menampilkan 30
END;
BEGIN
  do_something(n, n, n);
  dbms_output.put_line(n); -- menampilkan 20
END;

Karena merupakan penunjuk (pointer), cursor variables juga meningkatkan kemungkinan dari pengaliasan. Mari kita perhatikan contoh dibawah ini. Setelah pemberian nilai, emp_cv2 adalah sebuah alias dari emp_cv1 karena keduanya menunjuk kepada area kerja query yang sama. Sehingga, keduanya dapat mengubah keadaannya. Inilah mengapa fetch pertama dari emp_cv2 mengambil baris ketiga (bukan pertama) dan mengapa fetch kedua dari emp_cv2 gagal setelah kita menutup emp_cv1.

PROCEDURE get_emp_data (
emp_cv1 IN OUT EmpCurTyp,
emp_cv2 IN OUT EmpCurTyp) IS
emp_rec emp%ROWTYPE;
BEGIN
  OPEN emp_cv1 FOR SELECT * FROM emp;
    emp_cv2 := emp_cv1;
    FETCH emp_cv1 INTO emp_rec; -- melakukan fetch baris pertama
    FETCH emp_cv1 INTO emp_rec; -- melakukan fetch baris kedua
    FETCH emp_cv2 INTO emp_rec; -- melakukan fetch baris ketiga
  CLOSE emp_cv1;
  FETCH emp_cv2 INTO emp_rec; -- memunculkan INVALID_CURSOR
  ...
END;

8.13. Memberi Muatan Lebih Terhadap Nama-nama Subprogram

PL/SQL mengijinkan kita untuk meng-overload nama-nama subprogram dan type methods. Jadi, kita dapat menggunakan nama yang sama untuk beberapa subprogram berbeda sepanjang parameter-parameter formal mereka berbeda dalam jumlah, urutan, atau keluarga tipe data.

Misalkan kita intin menginisialisasi n baris pertama di dalam dua index-by tables yang telah dideklarasikan seperti beirkut ini:

DECLARE
  TYPE DateTabTyp IS TABLE OF DATE INDEX BY BINARY_INTEGER;
  TYPE RealTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER;
  hiredate_tab DateTabTyp;
  sal_tab RealTabTyp;
BEGIN
  ...
END;

Kita dapat menuliskan procedure berikut ini untuk menginisialisasi index-by table bernama hiredate_tab:

PROCEDURE initialize (tab OUT DateTabTyp, n INTEGER) IS
BEGIN
  FOR i IN 1..n LOOP
    tab(i) := SYSDATE;
  END LOOP;
END initialize;

Dan, kita dapat menuliskan procedure berikutnya untuk menginisialisasi index-by table bernama sal_tab:

PROCEDURE initialize (tab OUT RealTabTyp, n INTEGER) IS
BEGIN
  FOR i IN 1..n LOOP
    tab(i) := 0.0;
  END LOOP;
END initialize;

Karena pemrosesan di dalam dua procedure ini adalah sama, sangat logis memberikan nama yang sama kepada mereka.

Kita bisa menempatkan dua overloaded procedure initialize di dalam blok, subprogram atau package yang sama. PL/SQL menentukan procedure mana yang sedang dipanggil dengan cara memeriksa parameter-parameter formalnya. Dalam contoh berikut ini, versi dari initialize yang digunakan PL/SQL bergantung kepada apakah kita memanggil procedure tersebut dengan parameter DateTabTyp atau RealTabTyp.

DECLARE
  TYPE DateTabTyp IS TABLE OF DATE INDEX BY BINARY_INTEGER;
  TYPE RealTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER;
  hiredate_tab DateTabTyp;
  comm_tab RealTabTyp;
  indx BINARY_INTEGER;
  PROCEDURE initialize (tab OUT DateTabTyp, n INTEGER) IS
  BEGIN
    ...
  END;
  PROCEDURE initialize (tab OUT RealTabTyp, n INTEGER) IS
  BEGIN
    ...
  END;
BEGIN
  indx := 50;
  initialize(hiredate_tab, indx); -- memanggil versi pertama
  initialize(comm_tab, indx); -- memanggil versi kedua
  ...
END;

 

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