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.

Oracle PL/SQL kurzor

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.