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.

Tiivistรค tรคmรค viesti seuraavasti: