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.