Mis on kursor PL / SQL-is?
Kursor on selle kontekstipiirkonna kursor. Oracle loob SQL-lause töötlemiseks kontekstiala, mis sisaldab kogu teavet selle lause kohta.
PL / SQL võimaldab programmeerijal konteksti ala kursori kaudu juhtida. Kursor hoiab SQL-i käsu tagastatud ridu. Rida, mida kursor hoiab, nimetatakse aktiivseks komplektiks. Neid kursoreid saab nimetada ka nii, et neile saaks suunata koodi teisest kohast.
Selles õpetuses saate teada
- Kaudne kursor
- Selgesõnaline kursor
- Kursori atribuudid
- Loopkursori avaldus FOR
Kursorit on kahte tüüpi.
- Kaudne kursor
- Selgesõnaline kursor
Kaudne kursor
Alati, kui andmebaasis toimuvad DML-toimingud, luuakse kaudne kursor, mis hoiab selles konkreetses toimingus mõjutatud ridu. Neid kursoreid ei saa nimetada ja seega ei saa neid juhtida ega suunata koodi teisest kohast. Kursori atribuutide kaudu saame viidata ainult kõige uuemale kursorile.
Selgesõnaline kursor
Programmeerijatel on lubatud DML-toimingute teostamiseks luua nimeline kontekstiala, et selle üle rohkem kontrolli saada. Selgesõnaline kursor tuleks määratleda PL / SQL-ploki deklaratsiooniosas ja see luuakse käsu 'SELECT' jaoks, mida tuleb koodis kasutada.
Allpool on toodud sammud, mis on seotud selgesõnaliste kursoritega töötamisega.
- Kursori deklareerimine
Kursori deklareerimine tähendab lihtsalt deklaratsiooniosas määratletud lause „SELECT” jaoks ühe nimega kontekstiala loomist. Selle kontekstiala nimi on sama kui kursori nimi.
- Kursori avamine
Kursori avamine juhendab PL / SQL-i selle kursori jaoks mälu eraldama. See teeb kursori kirjete toomiseks valmis.
- Andmete toomine kursorilt
Selles protsessis käivitatakse käsk 'SELECT' ja tõmmatud read salvestatakse eraldatud mällu. Neid nimetatakse nüüd aktiivseteks komplektideks. Kursorilt andmete hankimine on rekordtaseme tegevus, mis tähendab, et pääseme andmetele juurde rekordipõhiselt.
Iga toomise lause toob ühe aktiivse komplekti ja sisaldab selle konkreetse kirje teavet. See lause on sama kui käsk 'SELECT', mis tõmbab kirje ja määrab muutujale klauslis 'INTO', kuid see ei tee erandeid.
- Kursori sulgemine
Kui kogu kirje on nüüd tõmmatud, peame kursori sulgema, et sellele kontekstialale eraldatud mälu vabaneks.
Süntaks:
DECLARECURSORIS
- Ülaltoodud süntaksis sisaldab deklaratsiooniosa kursori deklaratsiooni ja kursori muutujat, milles tõmmatud andmed määratakse.
- Kursor luuakse käsu 'SELECT' jaoks, mis on antud kursori deklaratsioonis.
- Täitmisosas avatakse, tõmmatakse ja suletakse deklareeritud kursor.
Kursori atribuudid
Nii implitsiitsel kursoril kui ka selgesõnalisel kursoril on teatud atribuudid, millele pääseb juurde. Need atribuudid annavad lisateavet kursori toimingute kohta. Allpool on toodud erinevad kursori atribuudid ja nende kasutamine.
Kursori atribuut | Kirjeldus |
% LEITUD | See tagastab tõeväärtuse tulemuse „TÕENE”, kui viimane tõmbetoiming kirje edukalt hankis, vastasel juhul tagastatakse vale. |
%EI LEITUD | See töötab vastupidiselt% FOUND-ile ja see tagastab väärtuse „TRUE”, kui viimane tõmbetoiming ei suutnud ühtegi kirjet tuua. |
%ON AVATUD | Kui antud kursor on juba avatud, tagastab Boole'i tulemuse „TRUE”, muidu tagastab „FALSE” |
% ROWCOUNT | See tagastab arvulise väärtuse. See annab tegeliku kirjete arvu, mida DML-i tegevus mõjutas. |
Näide 1 : Selles näites näeme, kuidas selgesõnalist kursorit deklareerida, avada, tuua ja sulgeda.
Projekteerime kursori abil kogu töötaja nime empi tabelist. Samuti kasutame kursori atribuuti, et seada silmus kogu kirje kursorilt toomiseks.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Koodi selgitus:
- Koodirida 2 : Kursori „SELECT emp_name FROM emp” kursori guru99_detaili deklareerimine.
- Koodirida 3 : muutuja lv_emp_name deklareerimine.
- Koodirida 5 : kursori guru99_det avamine.
- Koodirida 6: Basic loopi lause määramine kõigi tabelis 'emp' olevate kirjete toomiseks.
- Koodirida 7: tõmbab andmed guru99_det ja määrab väärtuse lv_emp_name.
- Koodirida 9: Kursori atribuudi '% NOTFOUND' abil saate leida, kas kogu kursori kirje on tõmmatud. Kui see on toodud, tagastatakse see 'TRUE' ja juhtelement väljub silmusest, vastasel juhul tõmbab juhtelement kursorilt andmeid ja prindib need.
- Koodirida 11: silmuse lause lause EXIT.
- Koodirida 12: printige tõmmatud töötaja nimi.
- Koodirida 14: Kursori atribuudi '% ROWCOUNT' kasutamine, et leida kursorist mõjutatud / tõmmatud kirjete koguarv.
- Koodirida 15: Pärast silmusest väljumist on kursor suletud ja eraldatud mälu vabastatakse.
Loopkursori avaldus FOR
"FOR LOOP" -lauset saab kasutada kursoritega töötamiseks. Võime anda FOR-tsükli lauses vahemiku piirangu asemel kursori nime, nii et silmus töötab kursori esimesest kirjest kuni kursori viimase kirjeni. Kursori muutuja, kursori avamine, kursori toomine ja sulgemine toimub kaudselt FOR-silmus.
Süntaks:
DECLARECURSORIS
- Ülaltoodud süntaksis sisaldab deklaratsiooniosa kursori deklaratsiooni.
- Kursor luuakse käsu 'SELECT' jaoks, mis on antud kursori deklaratsioonis.
- Täitmisosas on deklareeritud kursor seadistatud FOR-tsüklisse ja silmusmuutuja 'I' käitub sel juhul kursori muutujana.
Näide 1 : Selles näites projitseerime kogu töötaja nime emp tabelist, kasutades kursori-FOR silmus.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Väljund
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Koodi selgitus:
- Koodirida 2 : Kursori „SELECT emp_name FROM emp” kursori guru99_detaili deklareerimine.
- Koodirida 4 : Kursori „FOR” aasa konstrueerimine silmusmuutujaga lv_emp_name.
- Koodirida 5: töötaja nime printimine igas tsükli iteratsioonis.
- Koodirida 8: väljuge silmusest
Märkus . Kursori-FOR tsüklis ei saa kursori atribuute kasutada, sest FOR-silmus teeb kursori avamise, tõmbamise ja sulgemise kaudselt.