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.

  • 📍 Kontekstiala: Kursor osutab kontekstialale, mis salvestab SQL-lause ja selle tagastatud aktiivse hulga.
  • ⚙️ Kaudne kursor: Oracle avab iga DML-lause ja üherealise SELECT INTO käsu jaoks automaatselt kaudse kursori.
  • Selgesõnaline kursor: Programmeerija deklareerib, avab, tõmbab ja sulgeb täieliku kontrolli saavutamiseks selgesõnalise kursori.
  • 🔎 Kursori atribuudid: %FOUND, %NOTFOUND, %ISOPEN ja %ROWCOUNT näitavad viimase toimingu olekut.
  • 🔁 Kursori FOR-tsükkel: FOR-tsükkel avab, laadib alla ja sulgeb kursori kaudselt, ilma käsitsi sekkumiseta.
  • 🤖 AI abi: Tehisintellekti assistendid, näiteks GitHub Copilot, joonistavad kursori tsükleid ja märgistavad sulgemata kursorid.

Oracle PL/SQL kursor, kaudne, eksplitsiitne ja FOR-tsükkel

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.

Näide selgesõnalisest kursorist, mis toob töötajate nimesid emp-tabelist Oracle PL / SQL

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.

KKK

VIIDEKURSOR (kursori muutuja) on pointer päringu tulemuste komplektile. Erinevalt staatilisest kursorist saab see käitusajal avada erinevaid päringuid ja edastada tulemusi PL/SQL-plokkide vahel või kliendiprogrammidele.

Tavaline kursor laadib iga FETCH-i kohta ühe rea, mis põhjustab palju kontekstivahetusi. HULTEKOGU laadib ühe toomisega kollektsiooni palju ridu, vähendades järsult suurte tulemuskogumite üldkulu.

Jah. Deklareerige parameetriga kursor, näiteks CURSOR c(dept NUMBER) IS SELECT …, seejärel edastage väärtused OPEN c(10) juures. Parameetrid võimaldavad teil ühte kursori definitsiooni erinevate filtriväärtustega uuesti kasutada.

FOR UPDATE lukustab kursori valitud read, et keegi teine ​​neid muuta ei saaks. WHERE CURRENT OF seejärel uuendab või kustutab täpselt äsja toodud rea, ilma WHERE tingimust kordamata.

Avatud kursorid hoiavad oma mälu reserveerituna ja arvestatakse OPEN_CURSORS limiidi hulka. Paljude avatud kursorite jätmine põhjustab lõpuks ORA-01000: maksimaalne avatud kursorite arv on ületatud, seega SULGE alati pärast kasutamist konkreetne kursor.

Iga FETCH lülitub PL/SQL-i ja SQL-i mootorite vahel. Selliseid kontekstilülitusi on kokku tuhandeid, seega töötleb üks komplektipõhine SQL-lause või BULK COLLECT tavaliselt samu ridu palju kiiremini.

Jah. GitHubi koopia loob kommentaarist selgesõnalised OPEN, FETCH ja CLOSE tsüklid või kursori FOR tsüklid, lisab %NOTFOUND väljumiskontrollid ja pakub atribuutide nimesid, kuigi kõigepealt peaksite loogika üle vaatama.

Tehisintellekti assistendid märgistavad rida-realt kursori tsükleid, mis võivad muutuda hulga-põhisteks SQL-ideks või BULK COLLECT-ideks, tuvastavad suletud kursorid ja selgitavad %attribute käitumist. See masinõppe ülevaade parandab jõudlust enne koodi tootmiskeskkonda jõudmist.

Võta see postitus kokku järgmiselt: