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.

  • 📍 Kontextusterület: A kurzor arra a kontextusterületre mutat, amely egy SQL utasítást és annak visszaadott aktív halmazát tárolja.
  • 🇧🇷 Implicit kurzor: Oracle A program automatikusan megnyit egy implicit kurzort minden DML utasításhoz és egysoros SELECT INTO utasításhoz.
  • Explicit kurzor: A programozó a teljes kontroll érdekében deklarál, megnyit, lekér és bezár egy explicit kurzort.
  • ???? Kurzor attribútumok: A %FOUND, %NOTFOUND, %ISOPEN és %ROWCOUNT értékek a legutóbbi művelet állapotát jelzik.
  • 🔁 Kurzor FOR ciklus: Egy FOR ciklus implicit módon nyitja meg, hívja le és zárja a kurzort, manuális lépések nélkül.
  • 🤖 AI segítség: Az olyan mesterséges intelligencia asszisztensek, mint a GitHub Copilot, kurzorciklusokat készítenek, és megjelölik a nem lezárt kurzorokat.

Oracle PL/SQL kurzor implicit explicit és FOR ciklus

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.

Explicit kurzor példa, amely alkalmazottak nevét kéri le az emp táblából a következőben: Oracle PL / SQL

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.

GYIK

A REF CURSOR (kurzorváltozó) egy mutató egy lekérdezési eredményhalmazra. A statikus kurzorral ellentétben futási időben képes különböző lekérdezéseket megnyitni, és az eredményeket PL/SQL blokkok között vagy kliensprogramoknak átadni.

Egy normál kurzor FETCH műveletenként egy sort hív le, ami számos kontextusváltást okoz. ÖSSZES GYŰJTÉS sok sort tölt be egy gyűjteménybe egyetlen lekéréssel, jelentősen csökkentve a terhelést a nagy eredményhalmazok esetén.

Igen. Deklaráljon egy paraméteres kurzort, például CURSOR c(dept NUMBER) IS SELECT …, majd adja át az OPEN c(10) utasításban megadott értékeket. A paraméterek lehetővé teszik egy kurzordefiníció újrafelhasználását különböző szűrőértékekkel.

A FOR UPDATE függvény zárolja a kurzor által kijelölt sorokat, így senki más nem módosíthatja azokat. A WHERE CURRENT OF függvény ezután frissíti vagy törli az imént beolvasott pontos sort a WHERE feltétel megismétlése nélkül.

A nyitott kurzorok fenntartják a memóriájukat, és beleszámítanak az OPEN_CURSORS korlátba. Sok nyitott kurzor végül ORA-01000 hibát okoz: a nyitott kurzorok száma túllépve, ezért használat után mindig BE kell ZÁRNI egy explicit kurzort.

Minden FETCH vált a PL/SQL és az SQL motorok között. Több ezer ilyen kontextuskapcsoló összeadódik, így egyetlen halmazalapú SQL utasítás vagy BULK COLLECT általában sokkal gyorsabban dolgozza fel ugyanazokat a sorokat.

Igen. GitHub másodpilóta explicit OPEN, FETCH és CLOSE ciklusokat vagy kurzor FOR ciklusokat készít egy megjegyzésből, %NOTFOUND kilépési ellenőrzéseket ad hozzá, és attribútumneveket javasol, bár előbb érdemes áttekinteni a logikát.

A mesterséges intelligencia asszisztensek soronkénti kurzorciklusokat jelölnek meg, amelyek halmazalapú SQL-lé vagy BULK COLLECT-té válhatnak, észlelik a nem lezárt kurzorokat, és elmagyarázzák a %attribute viselkedését. Ez a gépi tanuláson alapuló áttekintés javítja a teljesítményt, mielőtt a kód elérné az éles környezetet.

Foglald össze ezt a bejegyzést a következőképpen: