Oracle PL/SQL-kohdistin: implisiittinen, eksplisiittinen, silmukalle esimerkin kanssa

⚡ Älykäs yhteenveto

Kursorit Oracle PL/SQL-kursorit ovat osoittimia kontekstialueelle, joka sisältää SQL-lausekkeen palauttamat rivit. Niitä on kahdenlaisia: implisiittiset kursorit, jotka luodaan automaattisesti DML:ää varten, ja eksplisiittiset kursorit, jotka ohjelmoija määrittelee ja joita hän ohjaa.

  • 📍 Kontekstialue: Kohdistin osoittaa kontekstialueelle, joka tallentaa SQL-lausekkeen ja sen palauttaman aktiivijoukon.
  • ⚙️ Implisiittinen kohdistin: Oracle avaa implisiittisen kohdistimen automaattisesti jokaiselle DML-lausekkeelle ja yksiriviselle SELECT INTO -käskylle.
  • ✋ Eksplisiittinen kohdistin: Ohjelmoija määrittelee, avaa, hakee ja sulkee eksplisiittisen kursorin saadakseen täyden hallinnan.
  • 🔎 Kohdistimen ominaisuudet: %FOUND, %NOTFOUND, %ISOPEN ja %ROWCOUNT ilmoittavat viimeisimmän toiminnon tilan.
  • 🔁 Kursorin FOR-silmukka: FOR-silmukka avaa, hakee ja sulkee kohdistimen implisiittisesti, eikä manuaalisia vaiheita tarvita.
  • 🤖 AI-apu: Tekoälyavustajat, kuten GitHub Copilot, luonnostavat kursorisilmukoita ja merkitsevät sulkemattomat kursorit.

Oracle PL/SQL-kursori, implisiittinen, eksplisiittinen ja FOR-silmukka

Mikä on CURSOR PL/SQL:ssä?

Kursori on osoitin kontekstialueelle. Oracle luo kontekstialueen käsittelyä varten SQL lauseke, ja tämä alue sisältää kaikki lauseketta koskevat tiedot.

PL / SQL mahdollistaa ohjelmoijan hallita kontekstialuetta kohdistimen avulla. Kohdistin sisältää SQL-lausekkeen palauttamat rivit, ja kohdistimen sisältämää rivijoukkoa kutsutaan aktiiviseksi joukoksi. Nämä kursorit voidaan myös nimetä, jotta niihin voidaan viitata koodin toisesta paikasta.

Kursoria on kahdenlaisia:

  • Implisiittinen kohdistin
  • Eksplisiittinen kohdistin

Implisiittinen kohdistin

Aina kun jokin DML-toiminto Jos tietokannassa tapahtuu toiminto , luodaan implisiittinen kursori, joka sisältää kyseisessä toiminnossa käytetyt rivit. Näitä kursoreita ei voi nimetä, joten niitä ei voida ohjata tai niihin ei voida viitata koodin toisesta kohdasta. Voimme viitata vain viimeisimpään kursoriin kursorin ominaisuuksien kautta.

Eksplisiittinen kohdistin

Ohjelmoijat voivat luoda nimetyn kontekstialueen DML-toimintojensa suorittamiseksi ja saada siitä enemmän hallintaa. Eksplisiittinen kursori tulisi määritellä funktion deklarointiosiossa. PL/SQL-lohko, ja se luodaan koodissa käytettävää SELECT-lauseketta varten.

Alla on vaiheet, jotka liittyvät eksplisiittisten kursoreiden käsittelyyn:

  • Kohdistimen määrittäminen: Kohdistimen määrittely tarkoittaa yksinkertaisesti yhden nimetyn kontekstialueen luomista SELECT-lausekkeelle, joka määritellään määrittelyosassa. Tämän kontekstialueen nimi on sama kuin kohdistimen nimi.
  • Kohdistimen avaaminen: Kohdistimen avaaminen käskee PL/SQL:ää varaamaan muistia tälle kohdistimelle. Se valmistelee kohdistimen tietueiden hakemiseen.
  • Tiedon hakeminen kursorista: Tässä prosessissa SELECT-lauseke suoritetaan ja noudetut rivit tallennetaan varattuun muistiin. Näitä kutsutaan nyt aktiivisiksi joukoiksi. Tiedon hakeminen kohdistimesta on tietuetason toiminto, mikä tarkoittaa, että voimme käyttää tietoja tietue kerrallaan. Jokainen fetch-lauseke noutaa yhden aktiivisen joukon ja sisältää kyseisen tietueen tiedot. Tämä lauseke on sama kuin SELECT-lauseke, joka noutaa tietueen ja sijoittaa sen INTO-lausekkeen muuttujaan, mutta se ei heitä mitään virhettä. poikkeukset.
  • Kohdistimen sulkeminen: Kun kaikki tietueet on noudettu, meidän on suljettava kohdistin, jotta tälle kontekstialueelle varattu muisti vapautuu.

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 deklarointiosa sisältää kohdistimen ja kohdistinmuuttujan deklaroinnin, johon noudetut tiedot sijoitetaan. Kursori luodaan kohdistimen deklaroinnissa annettua SELECT-lauseketta varten. Suoritusosassa ilmoitettu kohdistin avataan, noudetaan ja suljetaan.

Kohdistimen attribuutit

Sekä implisiittisellä että eksplisiittisellä kursorilla on tiettyjä ominaisuuksia, joihin voi päästä käsiksi. Nämä ominaisuudet antavat lisätietoja kursorin toiminnoista. Alla on lueteltu eri kursorin ominaisuudet ja niiden käyttö.

Kohdistimen attribuutti Tuotetiedot
% FOUND Palauttaa totuusarvon TRUE, jos viimeisin hakutoiminto nouti tietueen onnistuneesti; muuten se palauttaa FALSE.
%EI LÖYDETTY Toimii päinvastoin kuin %FOUND. Palauttaa arvon TRUE, jos viimeisin hakutoiminto ei pystynyt hakemaan yhtään tietuetta.
% ISOPEN Palauttaa loogisen tuloksen TOTUUSarvon TOSI, jos annettu kursori on jo auki; muuten se palauttaa arvon EPÄTOSI.
% ROWCOUNT Palauttaa numeerisen arvon, joka antaa toiminnon vaikuttamien tai noutamien tietueiden todellisen määrän.

Eksplisiittinen kursori esimerkki: Tässä esimerkissä näemme, miten eksplisiittinen kursori määritetään, avataan, noudetaan ja suljetaan. Projisoimme kaikkien työntekijöiden nimet emp-taulukosta kursorin avulla. Käytämme myös kursoriattribuuttia asettaaksemme silmukan noutamaan kaikki tietueet kursorista.

Alla oleva kuvakaappaus näyttää tämän eksplisiittisen kursoriesimerkin ja sen tulosteen Oracle.

Eksplisiittinen kursoriesimerkki työntekijöiden nimien hakemisesta emp-taulukosta Oracle PL / SQL

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%ROWCOUNT);
CLOSE guru99_det;
END;
/

ulostulo

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Total rows fetched is 3

Code Selitys

  • Code rivi 2: Kohdistimen guru99_det määrittely lausekkeelle 'SELECT emp_name FROM emp'.
  • Code rivi 3: Muuttujan lv_emp_name määrittäminen käyttämällä %tyyppi ankkuroitu emp.emp_name-tiedostoon.
  • Code rivi 5: Kohdistimen guru99_det avaaminen.
  • Code rivi 6: Perussilmukan asettaminen hakemaan kaikki emp-taulukon tietueet.
  • Code rivi 7: Noutaa guru99_det-tiedot ja määrittää arvon lv_emp_name-muuttujalle.
  • Code rivi 8: Käytetään kohdistimen attribuuttia %NOTFOUND tarkistetaan, onko kaikki kohdistimen tietueet noudettu. Jos noudettu, se palauttaa arvon TRUE ja control poistuu silmukasta; muuten control jatkaa datan noutamista kohdistimesta ja tulostaa sen.
  • Code rivi 10: EXIT-ehto silmukkakäskylle.
  • Code rivi 12: Tulosta haettu työntekijän nimi.
  • Code rivi 14: Kohdistimen attribuutin %ROWCOUNT avulla voit löytää kohdistimen noutamien tietueiden kokonaismäärän.
  • Code rivi 15: Silmukasta poistumisen jälkeen kursori suljetaan ja varattu muisti vapautetaan.

FOR Loop Cursor -lause

Kohdistin FOR silmukkaa voidaan käyttää kursoreiden kanssa työskentelyyn. Voimme antaa FOR-silmukassa kohdistimen nimen aluerajan sijaan, jolloin silmukka toimii kohdistimen ensimmäisestä tietueesta viimeiseen tietueeseen. Kursorimuuttujan arvon määrittäminen, kohdistimen avaaminen, hakeminen ja sulkeminen tehdään kaikki implisiittisesti FOR-silmukassa.

Syntaksi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

Yllä olevassa syntaksissa deklarointiosa sisältää kohdistimen deklaroinnin. Kursori luodaan kohdistimen deklaroinnissa annettua SELECT-lauseketta varten. Suoritusosassa deklaroitu kohdistin asetetaan FOR-silmukassa, ja silmukkamuuttuja 'I' toimii tässä tapauksessa kohdistinmuuttujana.

Oracle Silmukan kursoriesimerkki: Tässä esimerkissä projisoimme kaikkien työntekijöiden nimet emp-taulukosta käyttämällä kursori-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

Code Selitys

  • Code rivi 2: Kohdistimen guru99_det määrittely lausekkeelle 'SELECT emp_name FROM emp'.
  • Code rivi 4: FOR-silmukan muodostaminen kohdistimelle silmukkamuuttujalla lv_emp_name.
  • Code rivi 6: Työntekijän nimen tulostaminen jokaiseen silmukan iteraatioon.
  • Code rivi 7: Poistu silmukasta (LOPPU SILMUKKA).

Huomautus: Kursori-FOR-silmukassa kohdistimen attribuutteja ei voida käyttää, koska FOR-silmukka avaa, hakee ja sulkee kohdistimen implisiittisesti.

UKK

VIITEKURSORI (kursorimuuttuja) on osoitin kyselyn tulosjoukkoon. Toisin kuin staattinen kursori, se voi avata erilaisia ​​kyselyitä suorituksen aikana ja välittää tuloksia PL/SQL-lohkojen välillä tai asiakasohjelmiin.

Normaali kursori noutaa yhden rivin FETCH-komentoa kohden, mikä aiheuttaa useita kontekstinvaihtoja. bulkkikeräys lataa useita rivejä kokoelmaan yhdellä haulla, mikä vähentää huomattavasti suurten tulosjoukkojen työmäärää.

Kyllä. Määrittele parametrisoitu kursori, kuten CURSOR c(dept NUMBER) IS SELECT …, ja anna sitten arvot OPEN c(10):lle. Parametrien avulla voit käyttää yhtä kursorimääritelmää uudelleen eri suodatinarvoilla.

FOR UPDATE lukitsee kohdistimen valitsemat rivit, jotta kukaan muu ei voi muuttaa niitä. WHERE CURRENT OF päivittää tai poistaa sitten juuri noudetun rivin toistamatta WHERE-ehtoa.

Avoimet kursorit pitävät muistinsa varattuna ja lasketaan OPEN_CURSORS-rajaan. Useiden auki jättäminen aiheuttaa lopulta ORA-01000-virheen: avoinna olevien kursoreiden enimmäismäärä on ylitetty, joten SULJE aina eksplisiittinen kursori käytön jälkeen.

Jokainen FETCH-käsky vaihtaa PL/SQL- ja SQL-moottorien välillä. Tällaisia ​​kontekstikytkimiä on tuhansia, joten yksi joukkoon perustuva SQL-lauseke tai BULK COLLECT käsittelee yleensä samat rivit paljon nopeammin.

Kyllä. GitHub Copilot luo eksplisiittiset OPEN-, FETCH- ja CLOSE-silmukat tai kursorin FOR-silmukat kommentista, lisää %NOTFOUND-poistumistarkistukset ja ehdottaa attribuuttien nimiä, vaikka logiikka kannattaakin ensin tarkistaa.

Tekoälyavustajat merkitsevät rivi riviltä tapahtuvia kursorisilmukoita, joista voi tulla joukkopohjaisia ​​SQL- tai BULK COLLECT -käskyjä, havaitsevat sulkemattomat kursorit ja selittävät %attribute-käyttäytymisen. Tämä koneoppimisen tarkastelu parantaa suorituskykyä ennen kuin koodi pääsee tuotantoon.

Tiivistä tämä viesti seuraavasti: