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.

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.
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.

