Oracle PL/SQL-kohdistin: implisiittinen, eksplisiittinen, silmukalle esimerkin kanssa

โšก ร„lykรคs yhteenveto

Kursorit Oracle PL/SQL-kursorit ovat osoittimia kontekstialueelle, joka sisรคltรครค SQL-lausekkeen palauttamat rivit. Niitรค on kahdenlaisia: implisiittiset kursorit, jotka luodaan automaattisesti DML:รครค varten, ja eksplisiittiset kursorit, jotka ohjelmoija mรครคrittelee ja joita hรคn ohjaa.

  • ๐Ÿ“ Kontekstialue: Kohdistin osoittaa kontekstialueelle, joka tallentaa SQL-lausekkeen ja sen palauttaman aktiivijoukon.
  • โš™๏ธ Implisiittinen kohdistin: Oracle avaa implisiittisen kohdistimen automaattisesti jokaiselle DML-lausekkeelle ja yksiriviselle SELECT INTO -kรคskylle.
  • โœ‹ Eksplisiittinen kohdistin: Ohjelmoija mรครคrittelee, avaa, hakee ja sulkee eksplisiittisen kursorin saadakseen tรคyden hallinnan.
  • ๐Ÿ”Ž Kohdistimen ominaisuudet: %FOUND, %NOTFOUND, %ISOPEN ja %ROWCOUNT ilmoittavat viimeisimmรคn toiminnon tilan.
  • ๐Ÿ” Kursorin FOR-silmukka: FOR-silmukka avaa, hakee ja sulkee kohdistimen implisiittisesti, eikรค manuaalisia vaiheita tarvita.
  • ๐Ÿค– AI-apu: Tekoรคlyavustajat, kuten GitHub Copilot, luonnostavat kursorisilmukoita ja merkitsevรคt sulkemattomat kursorit.

Oracle PL/SQL-kursori, implisiittinen, eksplisiittinen ja FOR-silmukka

Mikรค on CURSOR PL/SQL:ssรค?

Kursori on osoitin kontekstialueelle. Oracle luo kontekstialueen kรคsittelyรค varten SQL lauseke, ja tรคmรค alue sisรคltรครค kaikki lauseketta koskevat tiedot.

PL / SQL mahdollistaa ohjelmoijan hallita kontekstialuetta kohdistimen avulla. Kohdistin sisรคltรครค SQL-lausekkeen palauttamat rivit, ja kohdistimen sisรคltรคmรครค rivijoukkoa kutsutaan aktiiviseksi joukoksi. Nรคmรค kursorit voidaan myรถs nimetรค, jotta niihin voidaan viitata koodin toisesta paikasta.

Kursoria on kahdenlaisia:

  • Implisiittinen kohdistin
  • Eksplisiittinen kohdistin

Implisiittinen kohdistin

Aina kun jokin DML-toiminto Jos tietokannassa tapahtuu toiminto , luodaan implisiittinen kursori, joka sisรคltรครค kyseisessรค toiminnossa kรคytetyt rivit. Nรคitรค kursoreita ei voi nimetรค, joten niitรค ei voida ohjata tai niihin ei voida viitata koodin toisesta kohdasta. Voimme viitata vain viimeisimpรครคn kursoriin kursorin ominaisuuksien kautta.

Eksplisiittinen kohdistin

Ohjelmoijat voivat luoda nimetyn kontekstialueen DML-toimintojensa suorittamiseksi ja saada siitรค enemmรคn hallintaa. Eksplisiittinen kursori tulisi mรครคritellรค funktion deklarointiosiossa. PL/SQL-lohko, ja se luodaan koodissa kรคytettรคvรครค SELECT-lauseketta varten.

Alla on vaiheet, jotka liittyvรคt eksplisiittisten kursoreiden kรคsittelyyn:

  • Kohdistimen mรครคrittรคminen: Kohdistimen mรครคrittely tarkoittaa yksinkertaisesti yhden nimetyn kontekstialueen luomista SELECT-lausekkeelle, joka mรครคritellรครคn mรครคrittelyosassa. Tรคmรคn kontekstialueen nimi on sama kuin kohdistimen nimi.
  • Kohdistimen avaaminen: Kohdistimen avaaminen kรคskee PL/SQL:รครค varaamaan muistia tรคlle kohdistimelle. Se valmistelee kohdistimen tietueiden hakemiseen.
  • Tiedon hakeminen kursorista: Tรคssรค prosessissa SELECT-lauseke suoritetaan ja noudetut rivit tallennetaan varattuun muistiin. Nรคitรค kutsutaan nyt aktiivisiksi joukoiksi. Tiedon hakeminen kohdistimesta on tietuetason toiminto, mikรค tarkoittaa, ettรค voimme kรคyttรครค tietoja tietue kerrallaan. Jokainen fetch-lauseke noutaa yhden aktiivisen joukon ja sisรคltรครค kyseisen tietueen tiedot. Tรคmรค lauseke on sama kuin SELECT-lauseke, joka noutaa tietueen ja sijoittaa sen INTO-lausekkeen muuttujaan, mutta se ei heitรค mitรครคn virhettรค. poikkeukset.
  • Kohdistimen sulkeminen: Kun kaikki tietueet on noudettu, meidรคn on suljettava kohdistin, jotta tรคlle kontekstialueelle varattu muisti vapautuu.

Syntaksi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
<cursor_variable declaration>;
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;

Yllรค olevassa syntaksissa deklarointiosa sisรคltรครค kohdistimen ja kohdistinmuuttujan deklaroinnin, johon noudetut tiedot sijoitetaan. Kursori luodaan kohdistimen deklaroinnissa annettua SELECT-lauseketta varten. Suoritusosassa ilmoitettu kohdistin avataan, noudetaan ja suljetaan.

Kohdistimen attribuutit

Sekรค implisiittisellรค ettรค eksplisiittisellรค kursorilla on tiettyjรค ominaisuuksia, joihin voi pรครคstรค kรคsiksi. Nรคmรค ominaisuudet antavat lisรคtietoja kursorin toiminnoista. Alla on lueteltu eri kursorin ominaisuudet ja niiden kรคyttรถ.

Kohdistimen attribuutti Tuotetiedot
% FOUND Palauttaa totuusarvon TRUE, jos viimeisin hakutoiminto nouti tietueen onnistuneesti; muuten se palauttaa FALSE.
%EI Lร–YDETTY Toimii pรคinvastoin kuin %FOUND. Palauttaa arvon TRUE, jos viimeisin hakutoiminto ei pystynyt hakemaan yhtรครคn tietuetta.
% ISOPEN Palauttaa loogisen tuloksen TOTUUSarvon TOSI, jos annettu kursori on jo auki; muuten se palauttaa arvon EPร„TOSI.
% ROWCOUNT Palauttaa numeerisen arvon, joka antaa toiminnon vaikuttamien tai noutamien tietueiden todellisen mรครคrรคn.

Eksplisiittinen kursori esimerkki: Tรคssรค esimerkissรค nรคemme, miten eksplisiittinen kursori mรครคritetรครคn, avataan, noudetaan ja suljetaan. Projisoimme kaikkien tyรถntekijรถiden nimet emp-taulukosta kursorin avulla. Kรคytรคmme myรถs kursoriattribuuttia asettaaksemme silmukan noutamaan kaikki tietueet kursorista.

Alla oleva kuvakaappaus nรคyttรครค tรคmรคn eksplisiittisen kursoriesimerkin ja sen tulosteen Oracle.

Eksplisiittinen kursoriesimerkki tyรถntekijรถiden nimien hakemisesta emp-taulukosta 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;
/

ulostulo

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Total rows fetched is 3

Code Selitys

  • Code rivi 2: Kohdistimen guru99_det mรครคrittely lausekkeelle 'SELECT emp_name FROM emp'.
  • Code rivi 3: Muuttujan lv_emp_name mรครคrittรคminen kรคyttรคmรคllรค %tyyppi ankkuroitu emp.emp_name-tiedostoon.
  • Code rivi 5: Kohdistimen guru99_det avaaminen.
  • Code rivi 6: Perussilmukan asettaminen hakemaan kaikki emp-taulukon tietueet.
  • Code rivi 7: Noutaa guru99_det-tiedot ja mรครคrittรครค arvon lv_emp_name-muuttujalle.
  • Code rivi 8: Kรคytetรครคn kohdistimen attribuuttia %NOTFOUND tarkistetaan, onko kaikki kohdistimen tietueet noudettu. Jos noudettu, se palauttaa arvon TRUE ja control poistuu silmukasta; muuten control jatkaa datan noutamista kohdistimesta ja tulostaa sen.
  • Code rivi 10: EXIT-ehto silmukkakรคskylle.
  • Code rivi 12: Tulosta haettu tyรถntekijรคn nimi.
  • Code rivi 14: Kohdistimen attribuutin %ROWCOUNT avulla voit lรถytรครค kohdistimen noutamien tietueiden kokonaismรครคrรคn.
  • Code rivi 15: Silmukasta poistumisen jรคlkeen kursori suljetaan ja varattu muisti vapautetaan.

FOR Loop Cursor -lause

Kohdistin FOR silmukkaa voidaan kรคyttรครค kursoreiden kanssa tyรถskentelyyn. Voimme antaa FOR-silmukassa kohdistimen nimen aluerajan sijaan, jolloin silmukka toimii kohdistimen ensimmรคisestรค tietueesta viimeiseen tietueeseen. Kursorimuuttujan arvon mรครคrittรคminen, kohdistimen avaaminen, hakeminen ja sulkeminen tehdรครคn kaikki implisiittisesti FOR-silmukassa.

Syntaksi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

Yllรค olevassa syntaksissa deklarointiosa sisรคltรครค kohdistimen deklaroinnin. Kursori luodaan kohdistimen deklaroinnissa annettua SELECT-lauseketta varten. Suoritusosassa deklaroitu kohdistin asetetaan FOR-silmukassa, ja silmukkamuuttuja 'I' toimii tรคssรค tapauksessa kohdistinmuuttujana.

Oracle Silmukan kursoriesimerkki: Tรคssรค esimerkissรค projisoimme kaikkien tyรถntekijรถiden nimet emp-taulukosta kรคyttรคmรคllรค kursori-FOR-silmukkaa.

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;
/

ulostulo

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY

Code Selitys

  • Code rivi 2: Kohdistimen guru99_det mรครคrittely lausekkeelle 'SELECT emp_name FROM emp'.
  • Code rivi 4: FOR-silmukan muodostaminen kohdistimelle silmukkamuuttujalla lv_emp_name.
  • Code rivi 6: Tyรถntekijรคn nimen tulostaminen jokaiseen silmukan iteraatioon.
  • Code rivi 7: Poistu silmukasta (LOPPU SILMUKKA).

Huomautus: Kursori-FOR-silmukassa kohdistimen attribuutteja ei voida kรคyttรครค, koska FOR-silmukka avaa, hakee ja sulkee kohdistimen implisiittisesti.

UKK

VIITEKURSORI (kursorimuuttuja) on osoitin kyselyn tulosjoukkoon. Toisin kuin staattinen kursori, se voi avata erilaisia โ€‹โ€‹kyselyitรค suorituksen aikana ja vรคlittรครค tuloksia PL/SQL-lohkojen vรคlillรค tai asiakasohjelmiin.

Normaali kursori noutaa yhden rivin FETCH-komentoa kohden, mikรค aiheuttaa useita kontekstinvaihtoja. bulkkikerรคys lataa useita rivejรค kokoelmaan yhdellรค haulla, mikรค vรคhentรครค huomattavasti suurten tulosjoukkojen tyรถmรครคrรครค.

Kyllรค. Mรครคrittele parametrisoitu kursori, kuten CURSOR c(dept NUMBER) IS SELECT โ€ฆ, ja anna sitten arvot OPEN c(10):lle. Parametrien avulla voit kรคyttรครค yhtรค kursorimรครคritelmรครค uudelleen eri suodatinarvoilla.

FOR UPDATE lukitsee kohdistimen valitsemat rivit, jotta kukaan muu ei voi muuttaa niitรค. WHERE CURRENT OF pรคivittรครค tai poistaa sitten juuri noudetun rivin toistamatta WHERE-ehtoa.

Avoimet kursorit pitรคvรคt muistinsa varattuna ja lasketaan OPEN_CURSORS-rajaan. Useiden auki jรคttรคminen aiheuttaa lopulta ORA-01000-virheen: avoinna olevien kursoreiden enimmรคismรครคrรค on ylitetty, joten SULJE aina eksplisiittinen kursori kรคytรถn jรคlkeen.

Jokainen FETCH-kรคsky vaihtaa PL/SQL- ja SQL-moottorien vรคlillรค. Tรคllaisia โ€‹โ€‹kontekstikytkimiรค on tuhansia, joten yksi joukkoon perustuva SQL-lauseke tai BULK COLLECT kรคsittelee yleensรค samat rivit paljon nopeammin.

Kyllรค. GitHub Copilot luo eksplisiittiset OPEN-, FETCH- ja CLOSE-silmukat tai kursorin FOR-silmukat kommentista, lisรครค %NOTFOUND-poistumistarkistukset ja ehdottaa attribuuttien nimiรค, vaikka logiikka kannattaakin ensin tarkistaa.

Tekoรคlyavustajat merkitsevรคt rivi riviltรค tapahtuvia kursorisilmukoita, joista voi tulla joukkopohjaisia โ€‹โ€‹SQL- tai BULK COLLECT -kรคskyjรค, havaitsevat sulkemattomat kursorit ja selittรคvรคt %attribute-kรคyttรคytymisen. Tรคmรค koneoppimisen tarkastelu parantaa suorituskykyรค ennen kuin koodi pรครคsee tuotantoon.

Tiivistรค tรคmรค viesti seuraavasti: