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
   használjuk
, mert ezzel
   a legegyszerűbb a
   feldolgozás!

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

FALSE

exception

exception

 

after

NULL

TRUE

NULL

0

First FETCH

before

NULL

TRUE

NULL

0

 

after

TRUE

TRUE

FALSE

1

Next FETCH(es)

before

TRUE

TRUE

FALSE

1

 

after

TRUE

TRUE

FALSE

data dependent

Last FETCH

before

TRUE

TRUE

FALSE

data dependent

 

after

FALSE

TRUE

TRUE

data dependent

CLOSE

before

FALSE

TRUE

TRUE

data dependent

 

after

exception

FALSE

exception

exception