Oracle PL/SQL kurzor: Implicit, Explicit, For Loop példával
⚡ Okos összefoglaló
Kurzorok a Oracle A PL/SQL mutatók arra a kontextusterületre mutatnak, amely az SQL utasítás által visszaadott sorokat tartalmazza. Kétféle kurzor létezik: implicit kurzorok, amelyeket automatikusan hoznak létre a DML számára, és explicit kurzorok, amelyeket a programozó deklarál és vezérel.
Mi a CURSOR a PL/SQL-ben?
A kurzor egy mutató a kontextusterületre. Oracle kontextusterületet hoz létre egy SQL utasítás, és ez a terület tartalmazza az utasítással kapcsolatos összes információt.
PL / SQL lehetővé teszi a programozó számára, hogy a kurzoron keresztül vezérelje a kontextusterületet. A kurzor az SQL utasítás által visszaadott sorokat tartalmazza, és a kurzor által tárolt sorok halmazát aktív halmaznak nevezzük. Ezeket a kurzorokat el is lehet nevezni, hogy a kód egy másik helyéről is hivatkozni lehessen rájuk.
A kurzor kétféle lehet:
- Implicit kurzor
- Explicit kurzor
Implicit kurzor
Amikor csak DML-művelet Amikor egy művelet történik az adatbázisban, egy implicit kurzor jön létre, amely az adott műveletben érintett sorokat tartalmazza. Ezek a kurzorok nem nevezhetők el, ezért nem vezérelhetők vagy hivatkozhatók rájuk a kód egy másik helyéről. A kurzor attribútumokon keresztül csak a legutóbbi kurzorra hivatkozhatunk.
Explicit kurzor
A programozók létrehozhatnak egy elnevezett kontextusterületet a DML-műveleteik végrehajtásához, és ezáltal nagyobb kontrollt szerezhetnek felette. Az explicit kurzort a deklarációs szakaszban kell definiálni. PL/SQL blokk, és a kódban használandó SELECT utasításhoz jön létre.
Az alábbiakban a explicit kurzorokkal való munka lépései láthatók:
- A kurzor deklarálása: A kurzor deklarálása egyszerűen azt jelenti, hogy létrehozunk egy elnevezett kontextusterületet a deklarációs részben definiált SELECT utasításhoz. Ennek a kontextusterületnek a neve megegyezik a kurzor nevével.
- A kurzor megnyitása: A kurzor megnyitása utasítja a PL/SQL-t, hogy foglaljon le memóriát a kurzor számára. Ez felkészíti a kurzort a rekordok beolvasására.
- Adatok lekérése a kurzorról: Ebben a folyamatban a SELECT utasítás végrehajtódik, és a kiolvasott sorok a lefoglalt memóriában tárolódnak. Ezeket most aktív halmazoknak nevezzük. Az adatok lekérése a kurzorból egy rekord szintű tevékenység, ami azt jelenti, hogy az adatokhoz rekordonként férhetünk hozzá. Minden lekérési utasítás egy aktív halmazt kér le, és az adott rekord információit tárolja. Ez az utasítás megegyezik egy SELECT utasítással, amely lekéri a rekordot, és hozzárendeli azt az INTO záradékban lévő változóhoz, de nem dob semmilyen hibát. kivételek.
- A kurzor bezárása: Miután az összes rekordot lekértük, be kell zárnunk a kurzort, hogy felszabaduljon a kontextusterülethez lefoglalt memória.
Szintaxis
DECLARE CURSOR <cursor_name> IS <SELECT statement>; <cursor_variable declaration>; BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
A fenti szintaxisban a deklarációs rész tartalmazza a kurzor és a kurzorváltozó deklarációját, amelyhez a beolvasott adat hozzárendelésre kerül. A kurzor a kurzordeklarációban megadott SELECT utasításhoz jön létre. A végrehajtási részben a deklarált kurzor megnyílik, beolvasódik és bezáródik.
Kurzor attribútumok
Mind az implicit, mind az explicit kurzor rendelkezik bizonyos elérhető attribútumokkal. Ezek az attribútumok további információkat nyújtanak a kurzorműveletekről. Az alábbiakban a különböző kurzorattribútumokat és azok használatát ismertetjük.
| Kurzor attribútum | Leírás |
|---|---|
| %MEGTALÁLT | A Logikai értéket, TRUE-t adja vissza, ha a legutóbbi lehívási művelet sikeresen lekérte a rekordot; egyébként FALSE-t ad vissza. |
| %NEM TALÁLHATÓ | A %FOUND függvénnyel ellentétesen működik. TRUE értéket ad vissza, ha a legutóbbi lekérési művelet nem tudott rekordot lekérni. |
| %NYITVA VAN | A logikai eredményt, az IGAZ értéket adja vissza, ha a megadott kurzor már meg van nyitva; egyébként HAMIS értéket ad vissza. |
| %ROWCOUNT | Egy numerikus értéket ad vissza, amely a művelet által érintett vagy lekért rekordok tényleges számát adja meg. |
Explicit kurzor példa: Ebben a példában bemutatjuk, hogyan deklarálhatunk, nyithatunk meg, kérhetünk le és zárhatunk le egy explicit kurzort. Az emp táblából egy kurzor segítségével kivetítjük az összes alkalmazott nevét. Egy kurzor attribútumot is használunk majd a ciklus beállításához, hogy a kurzor összes rekordját lekérje.
Az alábbi képernyőkép ezt az explicit kurzorpéldát és annak kimenetét mutatja be Oracle.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line('Employee Fetched:'||lv_emp_name); END LOOP; Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT); CLOSE guru99_det; END; /
teljesítmény
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Magyarázat
- Code 2. sor: A guru99_det kurzor deklarálása a 'SELECT emp_name FROM emp' utasításhoz.
- Code 3. sor: Az lv_emp_name változó deklarálása a következővel: %típus az emp.emp_name fájlhoz van horgonyozva.
- Code 5. sor: A guru99_det kurzor megnyitása.
- Code 6. sor: Az alapvető ciklusutasítás beállítása az emp tábla összes rekordjának lekérésére.
- Code 7. sor: Lekéri a guru99_det adatokat és hozzárendeli az értéket a lv_emp_name névhez.
- Code 8. sor: A %NOTFOUND kurzor attribútum használatával ellenőrizzük, hogy a kurzorban lévő összes rekord beolvasásra került-e. Ha beolvasásra került, akkor IGAZ értéket ad vissza, és a vezérlés kilép a ciklusból; egyébként a vezérlés továbbra is beolvassa az adatokat a kurzorból, és kinyomtatja azokat.
- Code 10. sor: EXIT feltétel a ciklusutasításhoz.
- Code 12. sor: Nyomtassa ki a lekért alkalmazott nevét.
- Code 14. sor: A kurzor attribútum %ROWCOUNT használatával megkereshetjük a kurzor által beolvasott rekordok teljes számát.
- Code 15. sor: A ciklusból való kilépés után a kurzor bezárul, és a lefoglalt memória felszabadul.
FOR Loop Cursor utasítás
Egy kurzor FOR hurok kurzorokkal való munkához használható. A FOR ciklusutasításban megadhatjuk a kurzor nevét tartománykorlát helyett, így a ciklus a kurzor első rekordjától az utolsó rekordjáig működik. A kurzorváltozó, a kurzor megnyitása, beolvasása és bezárása mind implicit módon történik a FOR ciklus által.
Szintaxis
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
A fenti szintaxisban a deklarációs rész tartalmazza a kurzor deklarációját. A kurzor a kurzordeklarációban megadott SELECT utasításhoz jön létre. A végrehajtási részben a deklarált kurzor a FOR ciklusban kerül beállításra, és az 'I' ciklusváltozó ebben az esetben kurzorváltozóként viselkedik.
Oracle Kurzor ciklushoz példa: Ebben a példában az emp táblából az összes alkalmazott nevét kivetítjük egy kurzor-FOR ciklus segítségével.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name); END LOOP; END; /
teljesítmény
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code Magyarázat
- Code 2. sor: A guru99_det kurzor deklarálása a 'SELECT emp_name FROM emp' utasításhoz.
- Code 4. sor: A kurzor FOR ciklusának felépítése az lv_emp_name ciklusváltozóval.
- Code 6. sor: Az alkalmazott nevének kinyomtatása a ciklus minden iterációjában.
- Code 7. sor: Kilépés a ciklusból (VÉGE LOOP).
Jegyzet: Egy kurzor-FOR ciklusban a kurzor attribútumai nem használhatók, mivel a kurzor megnyitását, lekérését és bezárását implicit módon a FOR ciklus végzi.


