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.
Gambar 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