Az explicit kurzor használatát a kurzor FOR ciklus alkalmazásával egyszerűsíthetjük. A kurzor FOR ciklus implicit módon %ROWTYPE típusúnak deklarálja a ciklusváltozóját, megnyitja a kurzort, betölti rendre az aktív halmaz összes sorát, majd ezután lezárja a kurzort. Alakja:
FOR ciklusváltozó IN {kurzornév [(paraméterek)] |(select-utasítás)}
LOOP utasítás [utasítás]… END LOOP;
1. példa
DECLARE
/* Megadja az adott dátum szerint lejárt kölcsönzésekhez
az ügyfél nevét, a könyv címét, valamint a lejárat
óta eltelt napok számának egész részét.
Ha nem adunk meg dátumot, akkor az aktuális
dátum lesz a kezdeti érték. */
CURSOR cur_lejart_kolcsonzesek(p_Datum DATE DEFAULT SYSDATE ) IS
SELECT napok, u.nev, k.cim
FROM ugyfel u, konyv k,
(SELECT TRUNC(p_Datum, 'DD') - TRUNC(datum)
- 30*(hosszabbitva+1) AS napok, kolcsonzo, konyv
FROM kolcsonzes) uk
WHERE uk.kolcsonzo = u.id
AND uk.konyv = k.id
AND napok > 0
ORDER BY UPPER(u.nev), UPPER(k.cim);
v_Nev ugyfel.nev%TYPE;
BEGIN
/* Hasonlítsuk össze ezt a megoldást a korábbival!
Vegyük észre, hogy a ciklusváltozó implicit módon van deklarálva. */
FOR v_Lejart IN cur_lejart_kolcsonzesek(TO_DATE('02-MÁJ. -09')) LOOP
/* Nincs FETCH és %NOTFOUND-ra sincs szükség. */
IF v_Nev IS NULL OR v_Nev <> v_Lejart.nev THEN
v_Nev := v_Lejart.nev;
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('Ügyfél: ' || v_Nev);
END IF;
DBMS_OUTPUT.PUT_LINE(' ' || v_Lejart.napok || ' nap, ' || v_Lejart.cim);
END LOOP;
/* A kurzor már le van zárva. */
END;
/
/* Eredmény:
Ügyfél: Jaripekka Hämälainen
22 nap, A critical introduction to twentieth-century American drama - Volume 2
22 nap, The Norton Anthology of American Literature - Second Edition - Volume 2
Ügyfél: József István
17 nap, ECOOP 2001 - Object-Oriented Programming
17 nap, Piszkos Fred és a többiek
A PL/SQL eljárás sikeresen befejeződött.
*/
Explicit kurzor helyett SQL lekérdezést is használhatunk. Ilyenkor egy rejtett kurzor keletkezik, ami a programozó számára hozzáférhetetlen. Ez nem az implicit kurzor lesz, ezért az implicit attribútumok nem adnak róla információt.
2. példa
BEGIN
/* Explicit kurzor helyett SQL lekérdezést is használhatunk.
Ilyenkor egy rejtett kurzor keletkezik, ami a programozó számára
hozzáférhetetlen, azaz az implicit attribútumok nem
adnak róla információt. */
FOR v_Ugyfel IN (SELECT * FROM ugyfel) LOOP
DBMS_OUTPUT.PUT_LINE(v_Ugyfel.id || ', ' || v_Ugyfel.nev);
IF SQL%ROWCOUNT IS NOT NULL THEN
/* Ide NEM kerül a vezérlés, mert a SQL%ROWCOUNT NULL. */
DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT: ' || SQL%ROWCOUNT);
END IF;
END LOOP;
END;
/
/* Eredmény:
5, Kovács János
10, Szabó Máté István
15, József István
20, Tóth László
25, Erdei Anita
30, Komor Ágnes
35, Jaripekka Hämälainen
A PL/SQL eljárás sikeresen befejeződött.
*/