Interaksi PL/SQL dengan Oracle

6.5.10. Mengurangi Network Traffic ketika Melewatkan Host Cursor Variable ke PL/SQL

Ketika melewatkan host cursor variable ke PL/SQL, kita dapat menekan network traffic dengan melakukan grouping perintah-perintah OPEN-FOR. Sebagai contoh, blok PL/SQL berikut ini membuka lima cursor variables dalam satu round trip tunggal:

/* anonymous PL/SQL block di dalam host environment */
BEGIN
  OPEN :emp_cv FOR SELECT * FROM emp;
  OPEN :dept_cv FOR SELECT * FROM dept;
  OPEN :grade_cv FOR SELECT * FROM salgrade;
  OPEN :pay_cv FOR SELECT * FROM payroll;
  OPEN :ins_cv FOR SELECT * FROM insurance;
END;

Hal ini mungkin berguna di dalam Oracle Forms, contohnya, ketika kita ingin mempopulasikan multi-block form.

Ketika kita melewatkan host cursor variables ke blok PL/SQL untuk pembukaan, area-area kerja query dimana mereka menunjuk tetap dapat diakses setelah blok selesai diproses. Hal ini mengijinkan program OCI atau Pro*C kita untuk menggunakan area-area kerja ini untuk operasi-operasi cursor biasa. Dalam contoh berikut ini, kita membuka beberapa area-area kerja seperti itu dalam satu round trip tunggal:

BEGIN
  OPEN :c1 FOR SELECT 1 FROM dual;
  OPEN :c2 FOR SELECT 1 FROM dual;
  OPEN :c3 FOR SELECT 1 FROM dual;
  OPEN :c4 FOR SELECT 1 FROM dual;
  OPEN :c5 FOR SELECT 1 FROM dual;
  ...
END;

Cursors diberikan nama c1, c2, c3, c4, dan c5 berkelakuan normal, dan kita dapat menggunakan mereka untuk berbagai tujuan. Ketika selesai, bebaskan cursor secara sederhana dengan cara sebagai berikut::

BEGIN
  CLOSE :c1;
  CLOSE :c2;
  CLOSE :c3;
  CLOSE :c4;
  CLOSE :c5;
  ...
END;

6.5.11. Menghindari Errors dengan Cursor Variables

Jika kedua cursor variables yang terkait di dalam proses assignment (pemberian nilai) adalah bertipe strong, mereka harus memiliki tipe data yang sama. Dalamc contoh berikut ini, meskipun cursor variables memiliki tipe hasil yang sama, proses pemberian nilai menyebabkan munculnya exception karena mereka memiliki tipe data yang berbeda:

DECLARE
  TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  TYPE TmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  PROCEDURE open_emp_cv (
  emp_cv IN OUT EmpCurTyp,
  tmp_cv IN OUT TmpCurTyp) IS
BEGIN
  ...
  emp_cv := tmp_cv; -- menyebabkan error 'wrong type'
END;

Namun, jika satu atau kedua cursor variables memiliki tipe weak, mereka tidak perlu memiliki tipe data yang sama.

Jika kita berusaha melakukan fetch dari, menutup, atau mengaplikasikan cursor attributes terhadap cursor variable yang tidak menunjuk kepada area kerja query, PL/SQL memunculkan INVALID_CURSOR. Kita dapat membuat cursor variable (atau parameter) menunjuk kepada area kerja query dengan dua cara:

Contoh berikut ini menunjukkan bagaimana cara-cara ini saling mempengaruhi:

DECLARE
  TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  emp_cv1 EmpCurTyp;
  emp_cv2 EmpCurTyp;
  emp_rec emp%ROWTYPE;
BEGIN
  /* Pemberian nilai berikut ini tidak berguna karena emp_cv1
  belum menunjuk ke area kerja query. */
  emp_cv2 := emp_cv1; -- useless
  /* Membuat emp_cv1 menunjuk ke area kerja query. */
  OPEN emp_cv1 FOR SELECT * FROM emp;
  /* Menggunakan emp_cv1 untuk fetch baris pertama dari tabel emp. */
  FETCH emp_cv1 INTO emp_rec;
  /* Fetch berikut ini memunculkan exception karena emp_cv2
  belum menunjuk ke area kerja query. */
  FETCH emp_cv2 INTO emp_rec; -- raises INVALID_CURSOR
  EXCEPTION
  WHEN INVALID_CURSOR THEN
  /* Menciptakan emp_cv1 dan emp_cv2 yang menunjuk ke area kerja yang sama. */
  emp_cv2 := emp_cv1;
  /* Menggunakan emp_cv2 untuk melakukan fetch baris ke dua dari tabel emp. */
  FETCH emp_cv2 INTO emp_rec;
  /* Menggunakan kembali area kerja untuk query yang lain. */
  OPEN emp_cv2 FOR SELECT * FROM old_emp;
  /* Menggunakan emp_cv1 untuk fetch baris pertama dari tabel old_emp.
  Fetch berikut ini berhasil karena emp_cv1 dan emp_cv2 menunjuk ke area
  kerja query yang sama. */
  FETCH emp_cv1 INTO emp_rec; -- succeeds
END;

Berhati-hatilah ketika melewatkan cursor variables sebagai parameters. Saat runtime, PL/SQL memunculkan ROWTYPE_MISMATCH jika tipe-tipe hasil dari parameter-parameter aktual dan formal tidak kompatibel.

Di dalam contoh Pro*C berikut ini, kita mendefinisikan tipe ter-package REF CURSOR, menentukan tipe hasil emp%ROWTYPE. Selanjutnya, kita menciptakan procedure standalone yang mereferensi tipe baru. Kemudian, di dalam blok PL/SQL, kita membuka host cursor variable untuk query dari table dept. Terakhir, ketika kita melewatkan host cursor variable terbuka kepada stored procedure, PL/SQL memunculkan ROWTYPE_MISMATCH karena tipe-tipe hasil dari parameter-parameter aktual dan formal tidak kompatibel.

CREATE PACKAGE cv_types AS
  TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  ...
END cv_types;
/
CREATE PROCEDURE open_emp_cv (emp_cv IN OUT cv_types.EmpCurTyp) AS
BEGIN
  OPEN emp_cv FOR SELECT * FROM emp;
END open_emp_cv;
/
-- anonymous PL/SQL block in Pro*C program
EXEC SQL EXECUTE
  BEGIN
    OPEN :cv FOR SELECT * FROM dept;
    ...
    open_emp_cv(:cv); -- raises ROWTYPE_MISMATCH
  END;
END-EXEC;

6.5.12. Batasan-batasan Cursor Variables

Saat ini, cursor variables mengikuti batasan-batasan berikut ini:

CREATE PACKAGE emp_stuff AS
  TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  emp_cv EmpCurTyp; -- tidak diperbolehkan
END emp_stuff;
DECLARE
  TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
  emp_cv EmpCurTyp;
  ...
BEGIN
  ...
  FOR emp_rec IN emp_cv LOOP ... -- tidak diperbolehkan
END;

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

 

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

[…] Interaksi PL/SQL dengan Oracle - 6,172 viewsFungsi Baris Tunggal - 4,245 viewsData Modelling dan Database Design - 3,954 viewsMengubah Table dan Constraint - 3,213 viewsTipe-tipe Data PL/SQL - 3,145 viewsPL/SQL Subprograms - 2,742 viewsMengontrol Akses User - 2,717 viewsCollections dan Records PL/SQL - 2,654 viewsMenampilkan Data - 2,572 viewsPendahuluan - 2,555 views […]

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