Oracle PL/SQL kurzor: Implicit, Explicit, For Loop példával
Mi a CURSOR a PL/SQL-ben?
A kurzor egy mutató erre a környezeti területre. Oracle kontextusterületet hoz létre egy SQL utasítás feldolgozásához, amely tartalmazza az utasítással kapcsolatos összes információt.
A PL/SQL lehetővé teszi a programozó számára, hogy a kurzoron keresztül vezérelje a környezeti területet. A kurzor az SQL utasítás által visszaadott sorokat tartalmazza. A kurzor által tartott sorok halmazát aktív halmaznak nevezzük. Ezeket a kurzorokat el is lehet nevezni, hogy a kód másik helyéről lehessen rájuk hivatkozni.
A kurzor kétféle.
- Implicit kurzor
- Explicit kurzor
Implicit kurzor
Amikor bármilyen DML művelet történik az adatbázisban, egy implicit kurzor jön létre, amely az adott műveletben érintett sorokat tartalmazza. Ezeket a kurzorokat nem lehet elnevezni, ezért nem irányíthatók vagy nem hivatkozhatók a kód másik helyéről. A kurzorattribútumokon keresztül csak a legutóbbi kurzorra hivatkozhatunk.
Explicit kurzor
A programozók létrehozhatnak egy elnevezett környezeti területet a DML-műveleteik végrehajtásához, hogy jobban irányíthassák azt. Az explicit kurzort a deklarációs szakaszban kell meghatározni PL/SQL blokk, és a kódban használandó „SELECT” utasításhoz jön létre.
Az alábbiakban az explicit kurzorokkal végzett munka lépései találhatók.
- A kurzor deklarálása A kurzor deklarálása egyszerűen azt jelenti, hogy egy elnevezett kontextusterületet kell létrehozni a deklarációs részben definiált 'SELECT' utasításhoz. Ennek a környezeti területnek a neve megegyezik a kurzor nevével.
- Nyitó kurzorA kurzor megnyitása utasítást ad a PL / SQL hogy lefoglalja a memóriát ehhez a kurzorhoz. A kurzor készen áll a rekordok lekérésére.
- Adatok lekérése a kurzorbólEbben a folyamatban a „SELECT” utasítás végrehajtásra kerül, és a lekért sorok a lefoglalt memóriában tárolódnak. Ezeket most aktív halmazoknak nevezzük. Az adatok lekérése a kurzorról rekordszintű tevékenység, ami azt jelenti, hogy rekordonként érhetjük el az adatokat. Minden fetch utasítás lekér egy aktív készletet, és tartalmazza az adott rekord információit. Ez az utasítás megegyezik a 'SELECT' utasítással, amely lekéri a rekordot, és hozzárendeli az 'INTO' záradékban lévő változót, de nem tesz kivételt.
- A kurzor bezárásaMiután az összes rekordot lekértük, be kell zárnunk a kurzort, hogy az ehhez a környezeti területhez lefoglalt memória felszabaduljon.
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 deklarációját és azt a kurzorváltozót, amelyhez a letöltött adatok hozzá lesznek rendelve.
- A kurzor a kurzordeklarációban megadott 'SELECT' utasításhoz jön létre.
- A végrehajtási részben a deklarált kurzort megnyitja, lekéri és bezárja.
Kurzor attribútumok
Mind az implicit, mind az explicit kurzornak vannak bizonyos attribútumai, amelyek elérhetők. Ezek az attribútumok több információt adnak a kurzorműveletekről. Az alábbiakban a különböző kurzorattribútumokat és azok használatát mutatjuk be.
Kurzor attribútum | Leírás |
---|---|
%MEGTALÁLT | Az 'TRUE' logikai eredményt adja vissza, ha a legutóbbi lekérési művelet sikeresen lekérte a rekordot, különben FALSE értéket ad vissza. |
%NEM TALÁLHATÓ | Ez ellentétben működik a %FOUND-tal, és 'TRUE' értéket ad vissza, ha a legutóbbi lekérési művelet nem tudott rekordot lekérni. |
%NYITVA VAN | 'TRUE' logikai eredményt ad vissza, ha az adott kurzor már nyitva van, ellenkező esetben 'FALSE'-t ad vissza. |
%ROWCOUNT | A számértéket adja vissza. Megadja a DML tevékenység által érintett rekordok tényleges számát. |
Explicit kurzor példa:
Ebben a példában látni fogjuk, hogyan lehet deklarálni, megnyitni, lekérni és bezárni az explicit kurzort.
Egy kurzor segítségével kivetítjük az alkalmazott összes nevét az emp táblából. A cursor attribútumot is használjuk a ciklus beállításához, hogy az összes rekordot lekérje a kurzorról.
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%R0WCOUNT); CLOSE guru99_det; END: /
teljesítmény
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Kód Magyarázat
- 2. kódsor: A guru99_det kurzor deklarálása a 'SELECT emp_name FROM emp' utasításhoz.
- 3. kódsor: Az lv_emp_name változó deklarálása.
- 5. kódsor: A kurzor megnyitása guru99_det.
- 6. kódsor: A Basic loop utasítás beállítása az 'emp' tábla összes rekordjának lekérésére.
- 7. kódsor: Lekéri a guru99_det adatokat, és hozzárendeli az értéket az lv_emp_name értékhez.
- 9. kódsor: A „%NOTFOUND” kurzorattribútum használata annak megállapítására, hogy a kurzorban lévő összes rekordot lekérték-e. Ha lekérjük, akkor 'TRUE'-t ad vissza, és a vezérlő kilép a ciklusból, különben a vezérlő folytatja az adatok lekérését a kurzorból és kinyomtatja az adatokat.
- 11. kódsor: EXIT feltétel a ciklusutasításhoz.
- 12. kódsor: Nyomtassa ki a lekért alkalmazott nevét.
- 14. kódsor: A „%ROWCOUNT” kurzorattribútum használatával megkeresheti a kurzorban érintett/lehívott rekordok teljes számát.
- 15. kódsor: 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
A „FOR LOOP” utasítás kurzorokkal való munkához használható. A FOR ciklus utasításban megadhatjuk a kurzor nevét a range limit helyett, így a ciklus a kurzor első rekordjától a kurzor utolsó rekordjáig fog működni. A kurzorváltozót, a kurzor megnyitását, a kurzor lekérését és bezárását implicit módon a FOR ciklus végzi.
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 van beállítva, és az 'I' ciklusváltozó ebben az esetben kurzorváltozóként fog viselkedni.
Oracle Kurzor a hurokpéldához:
Ebben a példában az összes alkalmazott nevét kivetítjük az emp táblából 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
Kód Magyarázat
- 2. kódsor: A guru99_det kurzor deklarálása a 'SELECT emp_name FROM emp' utasításhoz.
- 4. kódsor: A 'FOR' ciklus létrehozása a kurzor számára az lv_emp_name ciklusváltozóval.
- 5. kódsor: Az alkalmazott nevének kinyomtatása a ciklus minden iterációjában.
- 8. kódsor: Lépjen ki a hurokból
Jegyzet: A Cursor-FOR ciklusban a kurzorattribútumok nem használhatók, mivel a kurzor megnyitása, lekérése és bezárása implicit módon történik FOR hurok.