Ö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:
- Az összes ügyfél hitelkeretének nullázása.
- 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