Oracle PL/SQL kursor: kaudne, selgesõnaline, silmuse jaoks koos näitega
Mis on CURSOR PL/SQL-is?
Kursor on kursor sellele kontekstialale. Oracle loob kontekstiala SQL-lause töötlemiseks, mis sisaldab kogu teavet avalduse kohta.
PL/SQL võimaldab programmeerijal kursori kaudu kontekstiala juhtida. Kursor hoiab SQL-lause tagastatud ridu. Kursori all olevate ridade komplekti nimetatakse aktiivseks komplektiks. Neid kursoreid saab ka nimetada nii, et neile saab viidata koodi teisest kohast.
Kursorit on kahte tüüpi.
- Kaudne kursor
- Selge kursor
Kaudne kursor
Kui andmebaasis tehakse DML-i toiminguid, luuakse kaudne kursor, mis hoiab selle konkreetse toiminguga seotud ridu. Neid kursoreid ei saa nimetada ja seetõttu ei saa neid juhtida ega koodi teisest kohast viidata. Kursori atribuutide kaudu saame viidata ainult kõige uuemale kursorile.
Selge kursor
Programmeerijatel on lubatud DML-i toimingute tegemiseks luua nimega kontekstiala, et seda paremini kontrollida. Eksplitsiitne kursor tuleks määratleda deklaratsiooni jaotises PL/SQL plokk, ja see luuakse lause SELECT jaoks, mida tuleb koodis kasutada.
Allpool on toodud selgete kursoritega töötamise sammud.
- Kursori deklareerimine Kursori deklareerimine tähendab lihtsalt ühe nimega kontekstiala loomist avalduse SELECT jaoks, mis on määratletud deklaratsiooniosas. Selle kontekstiala nimi on sama mis kursori nimi.
- Kursori avamineKursori avamine juhendab PL / SQL selle kursori jaoks mälu eraldamiseks. See muudab kursori valmis kirjete toomiseks.
- Andmete toomine kursoriltSelle protsessi käigus käivitatakse käsk SELECT ja hangitud read salvestatakse eraldatud mällu. Neid nimetatakse nüüd aktiivseteks komplektideks. Andmete toomine kursorilt on rekordtasemel toiming, mis tähendab, et saame andmetele juurde pääseda kirje kaupa. Iga laadimislause toob ühe aktiivse komplekti ja sisaldab selle konkreetse kirje teavet. See avaldus on sama, mis käsk SELECT, mis toob kirje ja määrab muutujale klauslis INTO, kuid see ei tee erandeid.
- Kursori sulgemineKui kogu kirje on nüüd toodud, peame kursori sulgema, et sellele kontekstialale eraldatud mälu vabastataks.
Süntaks
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- Ülaltoodud süntaksis sisaldab deklaratsiooniosa kursori deklaratsiooni ja kursori muutujat, milles hangitud andmed määratakse.
- Kursor luuakse SELECT-lause jaoks, mis on antud kursori deklaratsioonis.
- Täitmise osas avatakse, tõmmatakse ja suletakse deklareeritud kursor.
Kursori atribuudid
Nii kaudsel kui ka eksplitsiitsel kursoril on teatud atribuudid, millele pääseb juurde. Need atribuudid annavad kursori toimingute kohta rohkem teavet. Allpool on toodud erinevad kursori atribuudid ja nende kasutamine.
| Kursori atribuut | Kirjeldus |
|---|---|
| % LEITUD | See tagastab Boole'i tulemuse 'TRUE', kui viimane laadimisoperatsioon tõi kirje edukalt, vastasel juhul tagastab see väärtuse FALSE. |
| %EI LEIDUD | See toimib vastupidiselt funktsioonile %FOUND ja tagastab väärtuse 'TRUE', kui viimane laadimisoperatsioon ei suutnud ühtegi kirjet tuua. |
| %ISOPEN | Tagastab Boole'i tulemuse 'TRUE', kui antud kursor on juba avatud, vastasel juhul tagastab 'FALSE' |
| %ROWCOUNT | See tagastab numbrilise väärtuse. See annab DML-i tegevusest mõjutatud kirjete tegeliku arvu. |
Selge kursori näide:
Selles näites näeme, kuidas selgesõnalist kursorit deklareerida, avada, tuua ja sulgeda.
Projitseerime kursori abil emp tabelist kogu töötaja nime. Samuti kasutame kursori atribuuti, et seada tsükkel kursorilt kogu kirje toomiseks.
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: /
Väljund
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Koodi selgitus
- Koodirida 2: Kursori guru99_det deklareerimine lausele 'SELECT emp_name FROM emp'.
- Koodirida 3: muutuja lv_emp_name deklareerimine.
- Koodirida 5: kursori avamine guru99_det.
- Koodirida 6: Põhisilmuse lause seadistamine kõigi tabelis 'emp' olevate kirjete toomiseks.
- Koodirida 7: Toob andmed guru99_det ja määrab väärtuse lv_emp_name.
- Koodirida 9: Kursori atribuudi „%NOTFOUND” kasutamine, et leida, kas kogu kursoris olev kirje on toodud. Tõmbamisel tagastab see väärtuse 'TRUE' ja juhtseade väljub tsüklist, vastasel juhul jätkab juhtelement andmete toomist kursorilt ja prindib andmed.
- Koodirida 11: Tingimus EXIT tsüklilause jaoks.
- Koodirida 12: Printige välja toodud töötaja nimi.
- Koodirida 14: Kursori atribuudi '%ROWCOUNT' kasutamine kursorisse mõjutatud/toodud kirjete koguarvu leidmiseks.
- Koodirida 15: Pärast tsüklist väljumist kursor suletakse ja eraldatud mälu vabastatakse.
FOR Loop Kursori lause
“FOR LOOP” lauset saab kasutada kursoritega töötamiseks. Võime anda FOR-silmuse lauses vahemiku piirangu asemel kursori nime, et tsükkel töötaks kursori esimesest kirjest kursori viimase kirjeni. Kursori muutuja, kursori avamine, kursori toomine ja sulgemine toimub kaudselt FOR tsükliga.
Süntaks
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- Ülaltoodud süntaksis sisaldab deklaratsiooniosa kursori deklaratsiooni.
- Kursor luuakse SELECT-lause jaoks, mis on antud kursori deklaratsioonis.
- Täitmise osas seadistatakse deklareeritud kursor tsüklis FOR ja tsüklimuutuja 'I' käitub sel juhul kursori muutujana.
Oracle Kursor tsükli näite jaoks:
Selles näites projitseerime emp tabelist kogu töötaja nime, kasutades kursori-FOR tsüklit.
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; /
Väljund
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Koodi selgitus
- Koodirida 2: Kursori guru99_det deklareerimine lausele 'SELECT emp_name FROM emp'.
- Koodirida 4: FOR tsükli konstrueerimine kursori jaoks tsüklimuutujaga lv_emp_name.
- Koodirida 5: Töötaja nime trükkimine tsükli igas iteratsioonis.
- Koodirida 8: Välju ahelast
Märge: Cursor-FOR tsüklis ei saa kursori atribuute kasutada, kuna kursori avamine, toomine ja sulgemine toimub kaudselt FOR silmus.

