Oracle PL/SQL kursor: kaudne, selgesõnaline, silmuse jaoks koos näitega
⚡ Nutikas kokkuvõte
Kursorid sees Oracle PL/SQL on pointerid kontekstialale, mis hoiab SQL-lause tagastatud ridu. Neid on kahte tüüpi: DML-i jaoks automaatselt loodud implitsiitsed kursorid ja programmeerija deklareeritud ja kontrollitud eksplitsiitsed kursorid.
Mis on CURSOR PL/SQL-is?
Kursor on kontekstialale viiv osuti. Oracle loob kontekstiala töötlemiseks SQL avaldus ja see ala sisaldab kogu teavet avalduse kohta.
PL / SQL võimaldab programmeerijal kursori abil kontekstiala juhtida. Kursor hoiab SQL-lause tagastatud ridu ja kursori hoitavat ridade komplekti nimetatakse aktiivseks komplektiks. Neid kursoreid saab ka nimetada, et neile saaks viidata koodis mujalt.
Kursor on kahte tüüpi:
- Kaudne kursor
- Selge kursor
Kaudne kursor
Alati, kui DML-i toimimine Kui andmebaasis toimub toiming „[sisestatakse]”, luuakse kaudne kursor, mis hoiab ridu, mida see konkreetne toiming mõjutab. Neid kursoreid ei saa nimetada ja seega ei saa neid koodis mujalt juhtida ega neile viidata. Kursori atribuutide kaudu saame viidata ainult kõige uuemale kursorile.
Selge kursor
Programmeerijatel on lubatud luua nimega kontekstiala oma DML-operatsioonide teostamiseks ja selle üle suurema kontrolli saamiseks. Selgesõnaline kursor tuleks defineerida deklaratsiooniosas. PL/SQL plokkja see luuakse koodis kasutatava SELECT-lause jaoks.
Allpool on toodud sammud selgesõnaliste kursorite kasutamiseks:
- Kursori deklareerimine: Kursori deklareerimine tähendab lihtsalt ühe nimega kontekstiala loomist SELECT-lause jaoks, mis on defineeritud deklaratsiooniosas. Selle kontekstiala nimi on sama mis kursori nimi.
- Kursori avamine: Kursori avamine annab PL/SQL-ile käsu sellele kursorile mälu eraldada. See valmistab kursori ette kirjete toomiseks.
- Kursorist andmete hankimine: Selles protsessis täidetakse SELECT-lause ja hangitud read salvestatakse eraldatud mällu. Neid nimetatakse nüüd aktiivseteks hulkadeks. Andmete toomine kursorist on kirje tasemel tegevus, mis tähendab, et me saame andmetele ligi pääseda kirje-kirje kaupa. Iga toolause toob ühe aktiivse hulga ja hoiab selle konkreetse kirje teavet. See lause on sama mis SELECT-lause, mis toob kirje ja määrab selle INTO-klauslis olevale muutujale, kuid see ei viska ühtegi viga. erandid.
- Kursori sulgemine: Kui kõik kirjed on alla laaditud, 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 ja kursori muutuja deklaratsiooni, kuhu hangitud andmed omistatakse. Kursor luuakse kursorideklaratsioonis antud SELECT-lause jaoks. Täitmisosas deklareeritud kursor avatakse, hangitakse ja suletakse.
Kursori atribuudid
Nii varjatud kui ka otsesel 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 | Tagastab Boole'i väärtuse TRUE, kui viimane toomise toiming tõi kirje edukalt; vastasel juhul tagastab FALSE. |
| %EI LEIDUD | Toimib vastupidiselt funktsioonile %FOUND. Tagastab väärtuse TRUE, kui viimane toomise toiming ei suutnud ühtegi kirjet tuua. |
| %ISOPEN | Tagastab Boole'i tulemuse TRUE, kui antud kursor on juba avatud; vastasel juhul tagastab FALSE. |
| %ROWCOUNT | Tagastab numbrilise väärtuse, mis näitab toimingu poolt mõjutatud või toodud kirjete tegelikku arvu. |
Näide selgesõnalisest kursorist: Selles näites näeme, kuidas deklareerida, avada, tuua ja sulgeda selgesõnalist kursorit. Projitseerime kursori abil emp-tabelist kõik töötajate nimed. Samuti kasutame kursori atribuuti, et seadistada tsükkel nii, et see tooks kursorist kõik kirjed.
Allolev ekraanipilt näitab seda selgesõnalist kursori näidet ja selle väljundit Oracle.
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; /
Väljund
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Selgitus
- Code rida 2: Kursori guru99_det deklareerimine lause 'SELECT emp_name FROM emp' jaoks.
- Code rida 3: Muutuja lv_emp_name deklareerimine koos %tüüp ankurdatud emp.emp_name'iga.
- Code rida 5: Kursori guru99_det avamine.
- Code rida 6: Põhilise tsükli lause seadistamine emp-tabeli kõigi kirjete toomiseks.
- Code rida 7: Tõmbab guru99_det andmed ja määrab väärtuse lv_emp_name-le.
- Code rida 8: Kursori atribuudi %NOTFOUND abil kontrollitakse, kas kõik kursori kirjed on laetud. Kui see on laetud, tagastab see väärtuse TRUE ja juhtelement väljub tsüklist; vastasel juhul jätkab juhtelement andmete laekumist kursorist ja prindib need välja.
- Code rida 10: Tingimus EXIT tsüklilause jaoks.
- Code rida 12: Printige välja toodud töötaja nimi.
- Code rida 14: Kursori atribuudi %ROWCOUNT kasutamine kursori poolt toodud kirjete koguarvu leidmiseks.
- Code rida 15: Pärast tsüklist väljumist kursor suletakse ja eraldatud mälu vabastatakse.
FOR Loop Kursori lause
Kursor FOR silmus saab kasutada kursoritega töötamiseks. FOR-tsükli lauses saame vahemiku piirangu asemel anda kursori nime, nii et tsükkel töötab kursori esimesest kirjest kuni kursori viimase kirjeni. Kursori muutuja, kursori avamine, toomine ja sulgemine toimub kõik FOR-tsükli poolt kaudselt.
Süntaks
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
Ülaltoodud süntaksis sisaldab deklaratsiooni osa kursori deklaratsiooni. Kursor luuakse kursori deklaratsioonis antud SELECT-lause jaoks. Täitmisosas seadistatakse deklareeritud kursor FOR-tsüklis ja tsüklimuutuja 'I' käitub antud juhul kursorimuutujana.
Oracle Kursori näide tsükli jaoks: Selles näites projitseerime kõik töötajate nimed emp-tabelist kursori-FOR-tsükli abil.
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
Code Selgitus
- Code rida 2: Kursori guru99_det deklareerimine lause 'SELECT emp_name FROM emp' jaoks.
- Code rida 4: Kursori FOR-tsükli loomine tsüklimuutujaga lv_emp_name.
- Code rida 6: Töötaja nime trükkimine tsükli igas iteratsioonis.
- Code rida 7: Välju tsüklist (END LOOP).
Märge: Kursori-FOR-tsüklis ei saa kursori atribuute kasutada, kuna kursori avamine, toomine ja sulgemine toimub FOR-tsükli poolt kaudselt.


