Interaksi PL/SQL dengan Oracle

6.3. Memisahkan Cursor Specs dan Bodies dengan Packages

Kita dapat memisahkan spesifikasi cursor (spec secara singkat) dari tubuhnya untuk penempatan di dalam package. Dengan begitu, kita dapat mengubah tubuh cursor tanpa harus mengubah spesifikasi cursor. Kita mengkodekan spesifikasi cursor di dalam spesifikasi package dengan menggunakan sintaks berikut ini:CURSOR cursor_name [(parameter[, parameter]…)] RETURN return_type;

Dalam contoh berikut ini, kita menggunakan attribute %ROWTYPE untuk menyediakan tipe record yang merepresentasikan baris data di dalam tabel emp:

CREATE PACKAGE emp_stuff AS
  CURSOR c1 RETURN emp%ROWTYPE; -- declare cursor spec
  ...
END emp_stuff;
CREATE PACKAGE BODY emp_stuff AS
  CURSOR c1 RETURN emp%ROWTYPE IS
    SELECT * FROM emp WHERE sal > 2500; -- define cursor body
    ...
END emp_stuff;

Cursor tersebut tidak memiliki perintah SELECT karena klausa RETURN menentukan tipe data dari nilai yang dihasilkan. Namun, tubuh cursor harus memiliki perintah SELECT dan klausa RETURN yang sama seperti spesifikasi cursor. Juga, jumlah dan tipe data dari item-item di dalam daftar SELECT dan klausa RETURN harus cocok.

Cursor-cursor ter-package meningkatkan fleksibilitas. Sebagai contoh, kita dapat mengubah tubuh cursor di dalam contoh terakhir, tanpa harus mengubah spesifikasi cursor:

CREATE PACKAGE BODY emp_stuff AS
  CURSOR c1 RETURN emp%ROWTYPE IS
    SELECT *
    FROM emp
    WHERE deptno = 20; -- new WHERE clause
  ...
END emp_stuff;

Dari blok atau subprogram PL/SQL, kita menggunakan notasi titik untuk mereferensi cursor ter-package, seperti ditunjukkan oleh contoh berikut ini:

DECLARE
  emp_rec   emp%ROWTYPE;
  ...
BEGIN
  ...
  OPEN emp_stuff.c1;
  LOOP
    FETCH emp_stuff.c1 INTO emp_rec;
    EXIT WHEN emp_suff.c1%NOTFOUND;
    ...
  END LOOP;
  CLOSE emp_stuff.c1;
END;

Jangkauan dari cursor ter-package tidak terbatas pada block PL/SQL tertentu. Sehingga, ketika kita membuka cursor ter-package, ia tetap terbuka sampai kita menutupnya atau jika kita keluar dari session Oracle.

Oracle MagazineOracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world’s largest enterprise software company.

For more information about Oracle, please visit their Web site at http://www.oracle.com. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Get Free Oracle Magazine

6.4. Menggunakan Cursor FOR Loops

Di dalam banyak situasi yang membutuhkan explicit cusror, kita dapat menyederhanakan coding dengan menggunakan cursor FOR loop dibandingkan menggunakan perintah-perintah OPEN, FETCH, dan CLOSE. Cursor FOR loop secara implisit mendeklarasikan index loop-nya sebagai %ROWTYPE record, membuka cursor, secara berulangkali menempatkan nilai baris data dari result set  ke field-field di dalam record, dan menutup cusror ketika seluruh baris data selesai diproses.

Pertimbangkan blok PL/SQL dibawah ini, yang mana menghitung hasil dari eksperimen, kemudian menyimpan hasilnya di tabel sementara. Index FOR loop c1_rec secara implisit dideklarasikan sebagai record. Field-fieldnya menyimpan seluruh nilai-nilai kolom yang dihasilkan dari cursor c1. Notasi titik digunakan untuk mereferensi field-field individual.

DECLARE
  result temp.col1%TYPE;
  CURSOR c1 IS
    SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1;
BEGIN
  FOR c1_rec IN c1 LOOP
    /* calculate and store the results */
    result := c1_rec.n2 / (c1_rec.n1 + c1_rec.n3);
    INSERT INTO temp VALUES (result, NULL, NULL);
  END LOOP;
  COMMIT;
END;

Ketika cursor FOR loop dimasuki, nama cursor tidak dapat bergantung kepada cursor yang telah dibuka oleh perintah OPEN atau cursor FOR loop yang melingkupinya. Sebelum setiap iterasi dari FOR loop, PL/SQL memberikan nilai ke dalam record yang secara implisit dideklarasikan. Record didefinisikan hanya di dalam loop. Kita tidak dapat merefer ke field-fieldnya di luar loop.

Urutan perintah-perintah di dalam loop dieksekusi sekali untuk setiap baris yang memenuhi kriteria dari query yang terhubung dengan cursor. Ketika kita meninggalkan loop, cursor ditutup secara otomatis – bahkan jika kita menggunakan perintah EXIT atau GOTO untuk meninggalkan loop secara prematur atau sebuah exception muncul di dalam loop.

 

 

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


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