Mikä on CURSOR PL / SQL: ssä?
Kohdistin on osoitin tälle kontekstialueelle. Oracle luo kontekstialueen SQL-käskyn käsittelemiseksi, joka sisältää kaikki tiedot käskystä.
PL / SQL antaa ohjelmoijan hallita kontekstialuetta kohdistimen kautta. Kohdistin pitää SQL-käskyn palauttamat rivit. Kohdistimen pitämien rivien joukkoa kutsutaan aktiiviseksi joukoksi. Nämä kohdistimet voidaan myös nimetä niin, että niihin voidaan viitata koodin toisesta paikasta.
Tässä opetusohjelmassa opit-
- Implisiittinen kohdistin
- Selkeä kohdistin
- Kohdistimen määritteet
- FOR Loop Cursor -lauseke
Kohdistinta on kahden tyyppistä.
- Implisiittinen kohdistin
- Selkeä kohdistin
Implisiittinen kohdistin
Aina kun DML-operaatioita esiintyy tietokannassa, luodaan implisiittinen kohdistin, joka pitää rivit, joihin kyseinen operaatio vaikuttaa. Näitä kohdistimia ei voida nimetä, joten niitä ei voida ohjata tai ohjata koodin toisesta paikasta. Voimme viitata vain viimeisimpään kohdistimeen kohdistimen määritteiden kautta.
Selkeä kohdistin
Ohjelmoijilla on oikeus luoda nimetty kontekstialue DML-toimintojen suorittamiseksi, jotta sitä voidaan hallita paremmin. Selkeä kohdistin on määriteltävä PL / SQL-lohkon ilmoitusosassa, ja se luodaan SELECT-käskylle, jota on käytettävä koodissa.
Alla on vaiheita, jotka liittyvät nimenomaisten kohdistinten kanssa työskentelyyn.
- Kohdistimen julistaminen
Kohdistimen ilmoittaminen tarkoittaa yksinkertaisesti yhden nimetyn kontekstialueen luomista ilmoitusosassa määritetylle SELECT-käskylle. Tämän kontekstialueen nimi on sama kuin kohdistimen nimi.
- Kohdistimen avaaminen
Kohdistimen avaaminen opastaa PL / SQL: ää varaamaan muistin tälle kohdistimelle. Se tekee kohdistimen valmiiksi hakemaan tietueet.
- Haetaan tietoja kohdistimesta
Tässä prosessissa 'SELECT' -lauseke suoritetaan ja haetut rivit tallennetaan varattuun muistiin. Näitä kutsutaan nyt aktiivisiksi ryhmiksi. Tietojen hakeminen kohdistimesta on ennätystasoinen toiminta, mikä tarkoittaa, että pääsemme tietoihin tietueittain.
Jokainen hakulauseke hakee yhden aktiivisen ryhmän ja sisältää tietyn tietueen tiedot. Tämä lause on sama kuin SELECT-käsky, joka hakee tietueen ja määrittää muuttujalle INTO-lausekkeessa, mutta se ei aiheuta poikkeuksia.
- Kohdistimen sulkeminen
Kun kaikki tietueet on nyt haettu, meidän on suljettava kohdistin, jotta tälle kontekstialueelle varattu muisti vapautuu.
Syntaksi:
DECLARECURSORIS
- Yllä olevassa syntaksissa ilmoitusosa sisältää kohdistimen ja kohdistimen muuttujan ilmoituksen, johon haetut tiedot osoitetaan.
- Kohdistin luodaan 'SELECT' -lausekkeelle, joka annetaan kohdistimen ilmoituksessa.
- Suoritusosassa ilmoitettu kohdistin avataan, haetaan ja suljetaan.
Kohdistimen määritteet
Sekä implisiittisellä kohdistimella että eksplisiittisellä kohdistimella on tiettyjä ominaisuuksia, joihin pääsee. Nämä määritteet antavat lisätietoja kohdistimen toiminnoista. Alla on eri kohdistimen määritteet ja niiden käyttö.
Kohdistimen attribuutti | Kuvaus |
% LÖYDY | Se palauttaa Boolen tuloksen TOSI, jos viimeisin hakutoiminto noutaa tietueen onnistuneesti, muuten se palauttaa EPÄTOSI. |
%EI LÖYDETTY | Tämä toimii päinvastoin kuin% FOUND. Se palauttaa arvon TOSI, jos viimeisin hakutoiminto ei pystyisi hakemaan mitään tietuetta. |
% ISOPEN | Se palauttaa Boolen tuloksen 'TOSI', jos annettu kohdistin on jo avattu, muuten se palauttaa 'FALSE' |
% ROWCOUNT | Se palauttaa numeerisen arvon. Se antaa todellisen määrän tietueita, joihin DML-aktiivisuus vaikuttaa. |
Esimerkki 1 : Tässä esimerkissä aiomme nähdä, kuinka julistaa, avata, hakea ja sulkea nimenomainen kohdistin.
Heijastamme koko työntekijän nimen emp-taulukosta kohdistimen avulla. Käytämme myös kohdistimen määritettä asettamaan silmukka hakemaan kaikki tietueet kohdistimesta.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:/
Tuotos
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Koodin selitys:
- Koodirivi 2 : Kohdistimen guru99_det julistaminen käskylle 'SELECT emp_name FROM emp'.
- Koodirivi 3 : Muuttujan lv_emp_name ilmoittaminen.
- Koodirivi 5 : Kohdistimen guru99_det avaaminen.
- Koodirivi 6: Perussilmukan käskyn asettaminen hakemaan kaikki tietueet emp-taulukosta.
- Koodirivi 7: Haetaan guru99_det-tiedot ja määritetään arvo lv_emp_name.
- Koodirivi 9: Kohdistimen attribuutin '% NOTFOUND' avulla voit selvittää, haetaanko kaikki kohdistimen tietueet. Jos se haetaan, se palauttaa TOSI ja ohjaus poistuu silmukasta, muuten ohjaus jatkaa tietojen noutamista kohdistimesta ja tulostaa tiedot.
- Koodirivi 11: silmukan käskyn EXIT-ehto.
- Koodirivi 12: Tulosta haetun työntekijän nimi.
- Koodirivi 14: Kohdistimen attribuutin '% ROWCOUNT' avulla löydät niiden tietueiden kokonaismäärän, joihin kohdistin kohdistettiin / haettiin.
- Koodirivi 15: Kun olet poistunut silmukasta, kohdistin suljetaan ja varattu muisti vapautetaan.
FOR Loop Cursor -lauseke
"FOR LOOP" -lausetta voidaan käyttää kohdistimien kanssa työskentelyyn. Voimme antaa kohdistimen nimen FOR-silmukka-lauseen aluerajan sijasta, jotta silmukka toimisi kohdistimen ensimmäisestä tietueesta kohdistimen viimeiseen tietueeseen. Kohdistimen muuttuja, kohdistimen avaaminen, kohdistimen hakeminen ja sulkeminen tapahtuu implisiittisesti FOR-silmukassa.
Syntaksi:
DECLARECURSORIS
- Edellä olevassa syntaksissa ilmoitusosa sisältää kohdistimen ilmoituksen.
- Kohdistin luodaan 'SELECT' -lausekkeelle, joka annetaan kohdistimen ilmoituksessa.
- Suoritusosassa ilmoitettu kohdistin asetetaan FOR-silmukkaan ja silmukkamuuttuja 'I' käyttäytyy tässä tapauksessa kohdistimen muuttujana.
Esimerkki 1 : Tässä esimerkissä heijastetaan koko työntekijän nimi emp-taulukosta käyttämällä kohdistin-FOR-silmukkaa.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Tuotos
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Koodin selitys:
- Koodirivi 2 : Kohdistimen guru99_det julistaminen käskylle 'SELECT emp_name FROM emp'.
- Koodirivi 4 : Kohdistimen 'FOR' -silmukan rakentaminen silmukan muuttujalla lv_emp_name.
- Koodirivi 5: Työntekijän nimen tulostaminen silmukan jokaisessa iteraatiossa.
- Koodirivi 8: Poistu silmukasta
Huomaa: Cursor-FOR -silmukassa kohdistimen määritteitä ei voida käyttää, koska FOR-silmukka suorittaa implisiittisesti kohdistimen avaamisen, hakemisen ja sulkemisen.