Oracle PL/SQL kursor: implicitno, eksplicitno, for petlja s primjerom

Što je CURSOR u PL/SQL?

Kursor je pokazivač na ovo kontekstno područje. Oracle stvara kontekstno područje za obradu SQL naredbe koje sadrži sve informacije o naredbi.

PL/SQL omogućuje programeru kontrolu kontekstnog područja putem pokazivača. Kursor drži retke koje vraća SQL naredba. Skup redaka koje kursor drži naziva se aktivni skup. Ovi kursori se također mogu imenovati tako da se na njih može uputiti s drugog mjesta koda.

Kursor je dvije vrste.

  • Implicitni kursor
  • Eksplicitni kursor

Implicitni kursor

Kad god se u bazi podataka pojavi bilo kakva DML operacija, stvara se implicitni kursor koji drži zahvaćene retke u toj konkretnoj operaciji. Ovi kursori se ne mogu imenovati i, stoga, ne mogu se kontrolirati ili upućivati ​​s drugog mjesta koda. Možemo se pozvati samo na najnoviji kursor kroz atribute kursora.

Eksplicitni kursor

Programerima je dopušteno stvoriti imenovano kontekstno područje kako bi izvršili svoje DML operacije kako bi stekli veću kontrolu nad njim. Eksplicitni kursor trebao bi biti definiran u odjeljku deklaracije PL/SQL blok, a kreiran je za naredbu 'SELECT' koju je potrebno koristiti u kodu.

Ispod su koraci koji uključuju rad s eksplicitnim kursorima.

  • Deklaracija kursora Deklariranje kursora jednostavno znači stvaranje jednog imenovanog kontekstnog područja za naredbu 'SELECT' koja je definirana u dijelu deklaracije. Naziv ovog kontekstnog područja isti je kao naziv kursora.
  • Otvaranje kursoraOtvaranje pokazivača dat će upute PL / SQL za dodjelu memorije za ovaj kursor. Time će kursor biti spreman za dohvaćanje zapisa.
  • Dohvaćanje podataka s kursoraU ovom procesu se izvršava naredba 'SELECT' i dohvaćeni redovi se pohranjuju u dodijeljenu memoriju. Ovi se sada nazivaju aktivni skupovi. Dohvaćanje podataka s kursora je aktivnost na razini zapisa što znači da možemo pristupiti podacima na način zapis po zapis. Svaka izjava za dohvaćanje dohvaća jedan aktivni skup i sadrži informacije o tom određenom zapisu. Ova naredba je ista kao naredba 'SELECT' koja dohvaća zapis i dodjeljuje varijabli u klauzuli 'INTO', ali neće izbaciti iznimke.
  • Zatvaranje kursoraNakon što se sada dohvati sav zapis, moramo zatvoriti kursor kako bi se oslobodila memorija dodijeljena ovom kontekstualnom području.

Sintaksa

DECLARE
CURSOR <cursor_name> IS <SELECT statement^>
<cursor_variable declaration>
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;
  • U gornjoj sintaksi, deklaracijski dio sadrži deklaraciju kursora i varijable kursora u kojoj će se dodijeliti dohvaćeni podaci.
  • Kursor se kreira za naredbu 'SELECT' koja je dana u deklaraciji kursora.
  • U izvršnom dijelu, deklarirani kursor se otvara, dohvaća i zatvara.

Atributi kursora

Implicitni kursor i eksplicitni kursor imaju određene atribute kojima se može pristupiti. Ovi atributi daju više informacija o operacijama kursora. Ispod su različiti atributi kursora i njihova upotreba.

Atribut kursora Description
%PRONAĐENO Vraća Booleov rezultat 'TRUE' ako je posljednja operacija dohvaćanja uspješno dohvatila zapis, inače će vratiti FALSE.
%NIJE PRONAĐENO Ovo radi suprotno od %FOUND i vratit će 'TRUE' ako posljednja operacija dohvaćanja nije mogla dohvatiti nijedan zapis.
%OTVORENO JE Vraća Booleov rezultat 'TRUE' ako je dati kursor već otvoren, inače vraća 'FALSE'
%ROWCOUNT Vraća brojčanu vrijednost. Daje stvarni broj zapisa na koje je utjecala DML aktivnost.

Primjer eksplicitnog kursora:

U ovom primjeru ćemo vidjeti kako deklarirati, otvoriti, dohvatiti i zatvoriti eksplicitni kursor.

Projicirat ćemo sva imena zaposlenika iz emp tablice pomoću kursora. Također ćemo koristiti atribut kursora da postavimo petlju da dohvati sve zapise iz kursora.

Oracle PL/SQL kursor

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:
/

Izlaz

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

Objašnjenje koda

  • Kodna linija 2: Deklaracija kursora guru99_det za izjavu 'SELECT emp_name FROM emp'.
  • Kodna linija 3: Deklaracija varijable lv_emp_name.
  • Kodna linija 5: Otvaranje kursora guru99_det.
  • Redak koda 6: Postavljanje osnovne naredbe petlje za dohvaćanje svih zapisa u 'emp' tablici.
  • Redak koda 7: Dohvaća guru99_det podatke i dodjeljuje vrijednost lv_emp_name.
  • Redak koda 9: Korištenje atributa kursora '%NOTFOUND' za pronalaženje jesu li svi zapisi u kursoru dohvaćeni. Ako se dohvati, vratit će 'TRUE' i kontrola će izaći iz petlje, inače će kontrola nastaviti dohvaćati podatke s kursora i ispisati podatke.
  • Redak koda 11: EXIT uvjet za naredbu petlje.
  • Redak koda 12: Ispišite dohvaćeno ime zaposlenika.
  • Redak koda 14: Korištenje atributa kursora '%ROWCOUNT' za pronalaženje ukupnog broja zapisa koji su pogođeni/dohvaćeni u kursoru.
  • Redak koda 15: Nakon izlaska iz petlje kursor se zatvara i dodijeljena memorija se oslobađa.

FOR Loop Cursor izjava

Naredba “FOR LOOP” može se koristiti za rad s kursorima. Možemo dati ime kursora umjesto ograničenja raspona u izjavi petlje FOR tako da će petlja raditi od prvog zapisa kursora do posljednjeg zapisa kursora. Kursorsku varijablu, otvaranje kursora, dohvaćanje i zatvaranje kursora implicitno će obaviti FOR petlja.

Sintaksa

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • U gornjoj sintaksi, deklaracijski dio sadrži deklaraciju kursora.
  • Kursor se kreira za naredbu 'SELECT' koja je dana u deklaraciji kursora.
  • U izvršnom dijelu, deklarirani kursor je postavljen u FOR petlji i varijabla petlje 'I' će se u ovom slučaju ponašati kao varijabla kursora.

Oracle Kursor za primjer petlje:
U ovom primjeru projicirat ćemo sva imena zaposlenika iz emp tablice pomoću petlje pokazivača-FOR.

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;
/

Izlaz

Employee Fetched:BBB 
Employee Fetched:XXX
Employee Fetched:YYY

Objašnjenje koda

  • Kodna linija 2: Deklaracija kursora guru99_det za izjavu 'SELECT emp_name FROM emp'.
  • Kodna linija 4: Konstruiranje 'FOR' petlje za kursor s varijablom petlje lv_emp_name.
  • Redak koda 5: Ispisivanje imena zaposlenika u svakoj iteraciji petlje.
  • Redak koda 8: Izađi iz petlje

Bilješka: U petlji Cursor-FOR, atributi kursora se ne mogu koristiti jer se otvaranje, dohvaćanje i zatvaranje kursora vrši implicitno putem FOR petlja.