Wednesday 27 November 2013

74. Cursor pada PL-SQL

1.    Cursor

Oracle menggunakan area-area kerja (work area) untuk mengeksekusi perintah-perintah PL/SQL dan menyimpan informasi yang sedang diproses. Konstruksi PL/SQL yang disebut cursor mengijinkan kita memberi nama sebuah area kerja dan mengakses informasi yang ada di dalamnya. Terdapat dua macam cursor: implisit dan explisit. PL/SQL secara implisit mendeklarasikan cursor untuk seluruh perintah-perintah manipulasi data SQL, termasuk query-query yang hanya menghasilkan satu baris data. Untuk query-query yang menghasilkan lebih dari satu baris data, kita dapat secara eksplisit mendeklarasikan cursor untuk memproses baris-baris data secara individual.
DECLARE
CURSOR c1 IS
SELECT empno, ename, job FROM emp WHERE deptno = 20;
Kumpulan baris-baris data yang dihasilkan oleh query yang menghasilkan banyak baris data disebut dengan result set. Besarnya adalah jumlah baris data sesuai dengan kriteria pencarian. Seperti yang ditunjukkan oleh Gambar 1-2, explicit cursor “menunjuk” kepada current row (baris  terkini) di dalam result set.
rs.PNGGambar 1–2 Query Processing

Query yang menghasilkan banyak baris data mirip dengan pemrosesan file. Sebagai contoh, program COBOL membuka file, memproses records, dan kemudian menutup file. Demikian pula, program PL/SQL membuka cursor, memproses baris-baris data yang dihasilkan oleh query, kemudian menutup cursor tersebut. Seperti halnya file pointer yang menandai posisi terkini di dalam file yang sedang terbuka, cursor menandai posisi terkini dari result set.
Kita menggunakan perintah-perintah OPEN, FETCH dan CLOSE untuk mengontrol cursor. Perintah OPEN mengeksekusi query yang terkait dengan cursor, mengidentifikasi result set, dan memposisikan cursor sebelum baris pertama (first row). Perintah FETCH menampilkan baris data terkini (current row) dan memajukan cursor ke baris berikutnya (next row). Ketika baris terakhir (last row) selesai diproses, perintah CLOSE men-disable cursor.

7.1           Cursor FOR Loops

Pada banyak situasi yang membutuhkan explicit cursor, secara sederhana kita dapat melakukancoding dengan menggunakan cursor FOR loop dibanding menggunakan perintah OPEN, FETCH, dan CLOSE. Cursor FOR loop secara implisit mendeklarasikan loop index-nya sebagai record yang merepresentasikan baris data yang didapat database. Kemudian, ia membuka cursor, secara berulangkali mengambil nilai-nilai baris data dari result set ke field-field pada record, kemudian menutup cursor ketika seluruh baris data telah selesai diproses. Pada contoh berikut ini, cursor FOR loop secara implisit mendeklarasikan emp_rec sebagai sebuah record:
DECLARE
CURSOR c1 IS
SELECT ename, sal, hiredate, deptno FROM emp;
...
BEGIN
FOR emp_rec IN c1 LOOP
...
salary_total := salary_total + emp_rec.sal;
END LOOP;
Untuk mereferensi field-field tunggal di dalam record, kita menggunakan dot notation, dimana dot (.) berlaku sebagai penyeleksi komponen.

7.2           Cursor Variable

Seperti halnya cursor, cursor variable menunjuk kepada baris terkini (current row) di dalam result set dari multi-row query. Tetapi, tidak seperti cursor, cursor variable dapat
dibuka untuk type-compatible query. Ia tidak terikat dengan kepada query tertentu. Cursor variable benar-benar merupakan variable PL/SQL, diaman kita dapat memberikan nilai baru dan melewatkannya ke subprogram-subprogram di dalam database Oracle. Hal ini memberikan kita fleksibilitas lebih dan cara yang tepat untuk memusatkan proses menampilkan data.
Biasanya, kita membuka cursor variable dengan melewatkannya ke stored procedure yang mendeklarasikan cursor variable sebagai satu dari parameter-parameter formalnya. Procedure berikut ini membuka cursor variable yang bernama generic_cv untuk query yang dipilih:
PROCEDURE open_cv (generic_cv IN OUT GenericCurTyp,choice NUMBER) IS BEGIN
IF choice = 1 THEN
OPEN generic_cv FOR SELECT * FROM emp;
ELSIF choice = 2 THEN
OPEN generic_cv FOR SELECT * FROM dept;
ELSIF choice = 3 THEN
OPEN generic_cv FOR SELECT * FROM salgrade;
END IF;
...
END;


No comments:

Post a Comment