8. KURZOROK ÉS KURZORVÁLTOZÓK - Tankönyv 8. fejezet
Ha egy lekérdezésnél a kiválasztott sorok halmazát
egyenként akarjuk feldolgozni, kurzor
használata célszerű. A rendszer egy
SQL-DML utasítás feldolgozásához a memóriában egy környezeti területet használ,
amely információkat tartalmaz az utasítás
által feldolgozott sorokról, lekérdezés esetén tartalmazza a visszaadott
sorokat (amit aktív halmaznak
nevezünk) és tartalmaz egy mutatót az utasítás belső reprezentációjára. A kurzor
egy olyan eszköz, mellyel megnevezhetjük a környezeti területet, segítségével
hozzáférhetünk az ott elhelyezett információkhoz és a hozzárendelt kurzormutatóval az aktív halmaz sorait egyenként elérhetjük, feldolgozhatjuk.
· Implicit kurzor: a neve SQL, a rendszer
definiálja implicit módon az SQL-DML utasítások végrehajtásakor. Az utoljára végrehajtott DML utasításról az SQL kurzor
attribútumok adnak információt:
SQL%ISOPEN értéke
mindig FALSE,
SQL%NOTFOUND TRUE, ha
egy SELECT, INSERT, UPDATE, DELETE utasítás egyetlen soron
sem
hajtódott végre,
SQL%FOUND TRUE, ha
az SQL%NOTFOUND FALSE,
SQL%ROWCOUNT SELECT,
INSERT, UPDATE, DELETE utasítások által kezelt sorok száma.
·
Explicit kurzor: deklarálni kell a nevének és a
soronként feldolgozandó SELECT utasításnak az explicit megadásával. Az
explicit kurzor attribútumok a kurzorok és a kurzorváltozók aktuális állapotáról adnak információt: kurzornév%ISOPEN TRUE,
ha a kurzor meg van nyitva.
kurzornév%FOUND TRUE, ha
a FETCH sorbetöltés sikeres volt.
kurzornév%NOTFOUND TRUE, ha a FETCH sorbetöltés sikertelen volt.
kurzornév%ROWCOUNT az
eddig betöltésre került sorok száma.
Kurzor deklarációja: Fogadó rekord dekl: |
CURSOR
kurzornév [(formális_paraméter_lista)] [RETURN sortípus] IS select_utasítás; A select_utasítás INTO ág nélküli SELECT
lehet, ennek sorait fogjuk a kurzorral egyenként feldolgozni. Ha a kurzorral
kezelt sorra DELETE vagy UPDATE lesz CURRENT OF kurzornév záradékkal, akkor a SELECT-nek
tartalmazni kell a FOR UPDATE utasításrészt. A formális paraméterek csak IN típusúak lehetnek. A sortípus előírja, hogy a kurzor által szolgáltatott érték típusa (select_utasítás
eredménye) milyen típussal legyen kompatíbilis. v_rekord kurzornév%ROWTYPE; |
Kurzor használata: |
|
Megnyitás: |
OPEN kurzornév [(aktuális_paraméter_lista)]; Használat
előtt a kurzort meg kell nyitni, ekkor a lekérdezés futtatásra kerül, a kurzormutató az aktív halmaz első sorára áll. Ha a
SELECT tartalmaz FOR UPDATE részt, akkor a lekérdezett sorok zárolódnak
(táblakijelölő oszlop megadása esetén csak azon táblából származó sorok
lesznek zárolva, amelyből az oszlop származik). Megnyitott kurzort újra
megnyitni nem lehet, ekkor a CURSOR_ALREADY_OPEN kivétel kiváltódik. |
Aktuális sor betöltése: |
FETCH {kurzornév
| kurzorváltozó_név} {INTO{rekordnév
| változónév ,…} | BULK COLLECT INTO kollekciónév
,… [LIMIT sorok]}; A kurzorhoz vagy
kurzorváltozóhoz tartozó kurzormutató által címzett aktuális sort betölti a megadott a rekordba vagy változókba és
a kurzormutatót a következő sorra állítja. A BULK
COLLECT lehetőséget ad az összes
vagy több (LIMIT által megadott számú) sor kollekció(k)ba való töltésére. Ha a kurzor nincs megnyitva az
INVALID_CURSOR kivétel kiváltódik. |
Lezárás: |
CLOSE {kurzornév|kurzorváltozó_név}; Használat után le kell zárni. A kurzor újra
megnyitható. Ha a kurzor nincs megnyitva az INVALID_CURSOR kivétel
kiváltódik. |
Kurzor FOR-ciklus Nagyon gyakran
|
FOR rekord_ ciklusváltozó IN {kurzornév[(aktuális_paraméter_lista)] | (selelect_utasítás)} LOOP utasítások END LOOP; A rekord_ciklusváltozó
implicit módon a kurzor sorával azonos %ROWTYPE típusúnak van deklarálva. A
ciklus megnyitja a kurzort, betölti rendre az aktív halmaz sorait a rekord_ciklusváltozóba, ezután lezárja
a kurzort. A selelect_utasítás esetén az implicit kurzor attribútumok nem
adnak róla információt, FOR UPDATE része lehet, de nem megy a CURRENT OF kurzornév. |
Table 6-1 Cursor Attribute Values
|
|
%FOUND |
%ISOPEN |
%NOTFOUND |
%ROWCOUNT |
OPEN |
before |
exception |
|
exception |
exception |
|
after |
|
|
|
0 |
First FETCH |
before |
|
|
|
0 |
|
after |
|
|
|
1 |
Next FETCH(es) |
before |
|
|
|
1 |
|
after |
|
|
|
data dependent |
Last FETCH |
before |
|
|
|
data dependent |
|
after |
|
|
|
data dependent |
CLOSE |
before |
|
|
|
data dependent |
|
after |
exception |
|
exception |
exception |