PL / SQL kurzor

Összefoglaló: ebben az oktatóanyagban megismerheti a PL / SQL kurzort és annak használatát.

A kurzor egy mutató, amely egy lekérdezés eredményére mutat. A PL / SQL kétféle kurzorral rendelkezik: implicit kurzorokkal és explicit kurzorokkal.

Implicit kurzorok

Amikor az Oracle végrehajt egy SQL utasítást, például SELECT INTO, INSERT, UPDATE és DELETE, automatikusan létrehoz egy implicit kurzort.

Az Oracle belsőleg kezeli az implicit kurzorok teljes végrehajtási ciklusát, és csak a kurzor információit és állapotait tárja fel, például SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND és SQL%NOTFOUND.

Az implicit kurzor nem elegáns, ha a lekérdezés nulla vagy több sort ad vissza amelyek NO_DATA_FOUND vagy TOO_MANY_ROWS kivételt okoznak.

Kifejezett kurzorok

Egy explicit kurzor egy SELECT utasítás, amelyet kifejezetten deklaráltak az aktuális blokk deklarációs szakaszában vagy egy csomagspecifikációban.

Egy explicit kurzor esetében folytatása van A végrehajtási ciklus alatt OPEN, FETCH és CLOSE.

Az Oracle meghatároz egy végrehajtási ciklust, amely végrehajt egy SQL utasítást, és egy kurzort társít hozzá.

Az alábbi ábra egy explicit kurzor végrehajtási ciklusát mutatja be:

Vizsgáljuk meg az egyes lépéseket részletesen.

Nyújtsunk be kurzort

Egy explicit kurzor használata előtt deklarálnia kell azt egy blokk vagy csomag deklarációs szakaszában az alábbiak szerint:

Ebben a szintaxisban :

  • Először adja meg a kurzor nevét a CURSOR kulcsszó után.
  • Másodszor adjon meg egy lekérdezést az adatok lekérésére a IS kulcsszó után.

Nyissa meg a kurzort

Mielőtt elkezdené beolvasni a sorokat a kurzorból, meg kell nyitnia. A kurzor megnyitásához használja a következő szintaxist:

Ebben a szintaxisban a cursor_name a név a deklaráció szakaszban deklarált kurzorból.

A kurzor megnyitásakor az Oracle elemzi a lekérdezést, összeköti a változókat és végrehajtja a társított SQL utasítást.

Az Oracle végrehajtási tervet is meghatároz , társítja a gazdagépváltozókat és a kurzorparamétereket az SQL utasítás helyőrzőivel, meghatározza az eredményhalmazt és a kurzort az eredményhalmaz első sorára állítja.

További információ a paraméterezett kurzorról a következő oktatóanyagban.

Kurzorból történő lekérés

A FETCH utasítás az aktuális sor tartalmát változókba helyezi. Az FETCH utasítás szintaxisa a következő:

Az eredményhalmaz összes sorának lekéréséhez szükséged van minden sor beolvasásához az utolsóig.

Kurzor bezárása

Az összes sor beolvasása után be kell zárni a kurzort a CLOSE utasítás:

A kurzor bezárása arra utasítja az Oracle-t, hogy megfelelő időben engedje fel a kiosztott memóriát.

Ha egy kurzort deklarál egy névtelen blokk, eljárás vagy függvény, a kurzor automatikusan bezárul, amikor ezeknek az objektumoknak a végrehajtása véget ér.

Mindazonáltal kifejezetten be kell zárnia a csomagalapú kurzorokat. Ne feledje, hogy ha bezár egy olyan kurzort, amely még nem nyílt meg, az Oracle felvet egy INVALID_CURSOR kivételt.

Kifejezett kurzorattribútumok

Kurzor négy attribútuma van, amelyekre a következő formátumban hivatkozhat:

ahol cursor_name a explicit kurzor.

1)% ISOPEN

Ez az attribútum TRUE, ha a kurzor nyitva van, vagy FALSE ha nem.

2)% FOUND

Ennek az attribútumnak négy értéke van:

  • NULL az első lekérés előtt
  • TRUE ha egy rekord sikeresen be lett töltve
  • FALSE ha egyetlen sor sem jelenik meg
  • INVALID_CURSOR ha a kurzor nincs megnyitva

3)% NOTFOUND

Ennek az attribútumnak négy értéke van:

  • NULL az első lekérés előtt
  • FALSE ha a bejegyzés be lett töltve succ esszenciálisan
  • TRUE ha nem érkezett sor
  • INVALID_CURSOR ha a kurzor nincs megnyitva

3)% ROWCOUNT

A %ROWCOUNT attribútum visszaadja a kurzorról letöltött sorok számát. Ha a kurzor nincs megnyitva, akkor ez az attribútum INVALID_CURSOR -t adja vissza.

PL / SQL kurzor példa

A orders és order_items táblákat a a bemutató minta adatbázisa.

A következő utasítás olyan nézetet hoz létre, amely az ügyfelek árbevételét adja:

A jóváírás oszlop értéke a teljes árbevétel 5% -át teszi ki.

Tegyük fel, hogy névtelen fejlesztést kell készítenie. ezt blokkolja:

  1. Az összes ügyfél hitelkeretének nullázása.
  2. Az ügyfelek csökkenő sorrendben történő eladások szerinti rendezése és új hitelkorlátok megadása 1 millió költségvetésből.

A következő névtelen blokk szemlélteti a logikát:

A deklaráció részben három változót deklarálunk.

Az első l_budget amelynek kezdeti értéke 1,000,000.

A második változó egy c_sales amelynek utasítás az adatokat lekéri a sales nézetből:

A harmadik változó egy kurzor alapú rekord, amelynek neve: c_sales.

A végrehajtási szakaszban a következőket hajtjuk végre:

  • Először állítsa vissza a hitelkereteket az összes ügyfél nullára egy UPDATE utasítás használatával.
  • Másodszor nyissa meg a c_sales kurzort.
  • Harmadszor, húzza le az egyes sorokat a kurzorból. Minden ciklusos iterációban frissítjük a hitelkeretet és csökkentjük a költségvetést. A hurok akkor fejeződik be, ha nincs sor beolvasásra, vagy a költségvetés kimerült.
  • Végül zárja be a kurzort.

A következő lekérdezés lekérdezi az adatokat a customers táblázat a frissítés ellenőrzéséhez:

Eredmény:

Amint az eredményből jól látható, csak az első néhány ügyfél rendelkezik hitelkerettel. Ha összesíti az összes hitelkeretet, akkor a teljes összegnek 1 milliónak kell lennie az alábbiak szerint:

Most , meg kell értenie a PL / SQL kurzorokat, beleértve az implicit és az explicit kurzorokat, és azt, hogyan lehet őket hatékonyan felhasználni az adatok soros, tábláról történő feldolgozásához.

  • Hasznos volt ez az oktatóanyag?
  • IgenNem

Leave a Reply

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük