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.

Oracle PL/SQL-kohdistin

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.