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.

Oracle PL/SQL kursor

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.

Võta see postitus kokku järgmiselt: