Oracle PL/SQL-kohdistin: implisiittinen, eksplisiittinen, silmukalle esimerkin kanssa
Mikรค on CURSOR PL/SQL:ssรค?
Kohdistin on osoitin tรคlle kontekstialueelle. Oracle luo kontekstialueen SQL-kรคskyn kรคsittelyรค varten, joka sisรคltรครค kaikki tiedot kรคskystรค.
PL/SQL antaa ohjelmoijalle mahdollisuuden ohjata kontekstialuetta kohdistimen kautta. Kohdistin pitรครค sisรคllรครคn SQL-kรคskyn palauttamat rivit. Kohdistimen sisรคltรคmรครค riviรค kutsutaan aktiiviseksi sarjaksi. Nรคmรค kursorit voidaan myรถs nimetรค niin, ettรค niihin voidaan viitata koodin toisesta paikasta.
Kursori on kahden tyyppinen.
- Implisiittinen kohdistin
- Eksplisiittinen kohdistin
Implisiittinen kohdistin
Aina kun tietokannassa tapahtuu DML-toimintoja, luodaan implisiittinen kohdistin, joka pitรครค kyseisessรค toiminnossa vaikuttavat rivit. Nรคitรค kohdistimia ei voi nimetรค, joten niitรค ei voi ohjata tai viitata koodin toisesta paikasta. Voimme viitata vain viimeisimpรครคn kursoriin kohdistimen attribuuttien kautta.
Eksplisiittinen kohdistin
Ohjelmoijat voivat luoda nimetyn kontekstialueen DML-toimintojensa suorittamiseksi, jotta he voivat hallita sitรค paremmin. Eksplisiittinen kohdistin tulee mรครคrittรครค ilmoituksen osiossa PL/SQL-lohko, ja se luodaan SELECT-kรคskylle, jota on kรคytettรคvรค koodissa.
Alla on vaiheet, jotka liittyvรคt eksplisiittisten kohdistimien kรคyttรคmiseen.
- Kursorin ilmoittaminen Kohdistimen ilmoittaminen tarkoittaa yksinkertaisesti yhden nimetyn kontekstialueen luomista 'SELECT'-kรคskylle, joka on mรครคritelty ilmoitusosassa. Tรคmรคn kontekstialueen nimi on sama kuin kohdistimen nimi.
- AvauskohdistinKohdistimen avaaminen antaa ohjeita PL / SQL varata muistia tรคlle kohdistimelle. Se tekee kohdistimen valmiiksi noutamaan tietueet.
- Tietojen hakeminen osoittimestaTรคssรค prosessissa SELECT-kรคsky suoritetaan ja haetut rivit tallennetaan varattuun muistiin. Nรคitรค kutsutaan nyt aktiivisiksi ryhmiksi. Tietojen hakeminen kursorista on tietuetason toiminto, mikรค tarkoittaa, ettรค voimme kรคyttรครค tietoja tietuekohtaisesti. Jokainen hakulause hakee yhden aktiivisen joukon ja sisรคltรครค kyseisen tietueen tiedot. Tรคmรค kรคsky on sama kuin SELECT-kรคsky, joka hakee tietueen ja mรครคrittรครค INTO-lauseen muuttujan, mutta se ei aiheuta poikkeuksia.
- Kohdistimen sulkeminenKun kaikki tietueet on nyt haettu, meidรคn on suljettava kohdistin, jotta tรคlle kontekstialueelle varattu muisti vapautetaan.
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 ilmoitusosa sisรคltรครค kursorin mรครคrityksen ja kohdistinmuuttujan, johon haetut tiedot osoitetaan.
- Kursori luodaan 'SELECT'-kรคskylle, joka annetaan kohdistimen ilmoituksessa.
- Suoritusosassa ilmoitettu kohdistin avataan, haetaan ja suljetaan.
Kohdistimen attribuutit
Sekรค implisiittisellรค ettรค eksplisiittisellรค osoittimella on tiettyjรค mรครคritteitรค, joita voidaan kรคyttรครค. Nรคmรค attribuutit antavat lisรคtietoja kohdistimen toiminnoista. Alla on eri kohdistimen attribuutit ja niiden kรคyttรถ.
| Kohdistimen attribuutti | Tuotetiedot |
|---|---|
| % FOUND | Se palauttaa Boolen tuloksen 'TRUE', jos viimeisin hakutoiminto nouti tietueen onnistuneesti, muuten se palauttaa arvon FALSE. |
| %EI LรYDETTY | Tรคmรค toimii pรคinvastoin kuin %FOUND, se palauttaa arvon 'TRUE', jos viimeisin hakutoiminto ei pystynyt hakemaan mitรครคn tietuetta. |
| % ISOPEN | Se palauttaa Boolen tuloksen 'TRUE', jos annettu kohdistin on jo avattu, muuten se palauttaa 'FALSE' |
| % ROWCOUNT | Se palauttaa numeerisen arvon. Se nรคyttรครค tietueiden todellisen mรครคrรคn, joihin DML-toiminto on vaikuttanut. |
Explicit Cursor -esimerkki:
Tรคssรค esimerkissรค aiomme nรคhdรค, kuinka nimenomainen kohdistin julistetaan, avataan, haetaan ja suljetaan.
Projisoimme kaikki tyรถntekijรคn nimet emp-taulukosta kursorin avulla. Kรคytรคmme myรถs cursor-attribuuttia asettaaksemme silmukan hakemaan kaikki tietueet osoittimesta.
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: /
ulostulo
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Koodin selitys
- Koodirivi 2: Ilmoitetaan kohdistin guru99_det lauseelle 'SELECT emp_name FROM emp'.
- Koodirivi 3: Ilmoitetaan muuttuja lv_emp_name.
- Koodirivi 5: Kohdistimen avaaminen guru99_det.
- Koodirivi 6: Basic loop -kรคskyn asettaminen hakemaan kaikki 'emp'-taulukon tietueet.
- Koodirivi 7: Hakee guru99_det-tiedot ja mรครคrittรครค arvoksi lv_emp_name.
- Koodirivi 9: Kรคyttรคmรคllรค kohdistinattribuuttia '%NOTFOUND' selvittรครคksesi, haetaanko kaikki kohdistimen tietueet. Jos se haetaan, se palauttaa arvon 'TRUE' ja ohjaus poistuu silmukasta, muuten ohjaus jatkaa tietojen hakemista osoittimesta ja tulostaa tiedot.
- Koodirivi 11: EXIT-ehto silmukkakรคskylle.
- Koodirivi 12: Tulosta haettu tyรถntekijรคn nimi.
- Koodirivi 14: Kรคyttรคmรคllรค kohdistinattribuuttia '%ROWCOUNT' niiden tietueiden kokonaismรครคrรคn selvittรคmiseen, joihin kohdistin vaikutti tai joihin kohdistin haettiin.
- Koodirivi 15: Silmukasta poistumisen jรคlkeen kohdistin suljetaan ja varattu muisti vapautetaan.
FOR Loop Cursor -lause
"FOR LOOP" -lausetta voidaan kรคyttรครค kursorien kanssa tyรถskentelyyn. Voimme antaa kohdistimen nimen rangen sijaan FOR-silmukan kรคskyssรค, jotta silmukka toimii kohdistimen ensimmรคisestรค tietueesta kursorin viimeiseen tietueeseen. Kohdistimen muuttuja, kohdistimen avaaminen, kursorin nouto ja sulkeminen tapahtuu implisiittisesti FOR-silmukalla.
Syntaksi
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- Yllรค olevassa syntaksissa ilmoitusosa sisรคltรครค kursorin mรครคrityksen.
- Kursori luodaan 'SELECT'-kรคskylle, joka annetaan kohdistimen ilmoituksessa.
- Suoritusosassa ilmoitettu kohdistin asetetaan FOR-silmukkaan ja silmukkamuuttuja 'I' toimii tรคssรค tapauksessa kursorimuuttujana.
Oracle Kursori silmukkaesimerkille:
Tรคssรค esimerkissรค projisoimme kaikki tyรถntekijรคn nimet emp-taulukosta kรคyttรคmรคllรค cursor-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
Koodin selitys
- Koodirivi 2: Ilmoitetaan kohdistin guru99_det lauseelle 'SELECT emp_name FROM emp'.
- Koodirivi 4: FOR-silmukan rakentaminen kursorille silmukkamuuttujan lv_emp_name kanssa.
- Koodirivi 5: Tyรถntekijรคn nimen tulostaminen jokaiseen silmukan iteraatioon.
- Koodirivi 8: Poistu silmukasta
Huomautus: Cursor-FOR-silmukassa kohdistimen attribuutteja ei voi kรคyttรครค, koska kohdistimen avaaminen, hakeminen ja sulkeminen tapahtuu implisiittisesti FOR silmukkaa.

