Što je KURSOR u PL / SQL-u?
Pokazivač je pokazivač na ovo kontekstno područje. Oracle stvara područje konteksta za obradu SQL izraza koji sadrži sve informacije o izrazu.
PL / SQL omogućuje programeru da kontrolira područje konteksta kroz kursor. Kursor sadrži retke koje vraća SQL izraz. Skup redaka koji kursor drži naziva se aktivnim skupom. Ovi se pokazivači također mogu imenovati tako da se na njih može uputiti s drugog mjesta koda.
U ovom vodiču naučit ćete-
- Implicitni pokazivač
- Eksplicitni pokazivač
- Atributi kursora
- ZA Izjavu kursora petlje
Kursor je dvije vrste.
- Implicitni pokazivač
- Eksplicitni pokazivač
Implicitni pokazivač
Kad god se u bazi podataka pojave bilo kakve DML operacije, stvara se implicitni kursor koji sadrži pogođene retke u toj određenoj operaciji. Ti se kursori ne mogu imenovati i, prema tome, ne mogu se kontrolirati ili uputiti s drugog mjesta koda. Možemo se pozivati samo na najnoviji kursor kroz atribute kursora.
Eksplicitni pokazivač
Programerima je omogućeno stvaranje imenovanog kontekstnog područja za izvršavanje njihovih DML operacija kako bi dobili veću kontrolu nad njim. Eksplicitni kursor trebao bi biti definiran u odjeljku deklaracije bloka PL / SQL i stvoren je za izraz 'SELECT' koji treba koristiti u kodu.
Ispod su koraci koji uključuju rad s eksplicitnim kursorima.
- Izjava kursora
Deklaracija kursora jednostavno znači stvoriti jedno imenovano područje konteksta za izraz 'SELECT' koji je definiran u dijelu deklaracije. Naziv ovog kontekstnog područja jednak je nazivu kursora.
- Otvaranje kursora
Otvaranje kursora uputit će PL / SQL da dodijeli memoriju za ovaj kursor. Kursor će biti spreman za dohvaćanje zapisa.
- Dohvaćanje podataka iz pokazivača
U ovom se postupku izvršava naredba 'SELECT' i dohvaćeni se retci pohranjuju u dodijeljenu memoriju. Oni se sada nazivaju aktivnim skupovima. Dohvaćanje podataka iz kursora aktivnost je na razini zapisa koja znači da im možemo pristupiti na način evidencije.
Svaka naredba dohvaćanja dohvatit će jedan aktivni skup i sadrži podatke tog određenog zapisa. Ova je izjava jednaka naredbi 'SELECT' koja dohvaća zapis i dodjeljuje varijabli u klauzuli 'INTO', ali neće izuzeti.
- Zatvaranje kursora
Nakon što se sada dohvati sav zapis, trebamo zatvoriti kursor tako da se oslobodi memorija dodijeljena ovom kontekstnom području.
Sintaksa:
DECLARECURSORIS
- U gornjoj sintaksi, dio deklaracije sadrži deklaraciju kursora i varijablu kursora u kojoj će biti dodijeljeni dohvaćeni podaci.
- Kursor se kreira za izraz 'SELECT' koji je dan u deklaraciji kursora.
- U izvršnom dijelu deklarirani kursor se otvara, dohvaća i zatvara.
Atributi kursora
I implicitni i eksplicitni kursor imaju određene atribute kojima se može pristupiti. Ti atributi daju više informacija o operacijama kursora. Ispod su različiti atributi kursora i njihova upotreba.
Atribut kursora | Opis |
%PRONAĐENO | Vraća logički rezultat 'TRUE' ako je zadnja operacija dohvaćanja uspješno dohvatila zapis, inače će vratiti FALSE. |
%NIJE PRONAĐENO | Ovo radi suprotno od% FOUND, vratit će "TRUE" ako najnovija operacija dohvaćanja nije mogla dohvatiti nijedan zapis. |
%OTVORENO JE | Vraća logički rezultat 'TRUE' ako je zadani kursor već otvoren, inače vraća 'FALSE' |
% ROWCOUNT | Vraća numeričku vrijednost. Daje stvarni broj zapisa na koje je utjecala DML aktivnost. |
Primjer 1 : U ovom ćemo primjeru vidjeti kako prijaviti, otvoriti, dohvatiti i zatvoriti eksplicitni kursor.
Svo ime zaposlenika projicirat ćemo iz emp tablice pomoću kursora. Također ćemo upotrijebiti atribut kursora za postavljanje petlje za dohvaćanje svih zapisa s kursora.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Objašnjenje koda:
- Redak koda 2 : Deklariranje kursora guru99_det za izraz "SELECT emp_name FROM emp".
- Redak koda 3 : Deklariranje varijable lv_emp_name.
- Redak koda 5 : Otvaranje kursora guru99_det.
- Redak 6: Postavljanje naredbe Basic loop za dohvaćanje svih zapisa u tablici 'emp'.
- Redak koda 7: Dohvaća podatke guru99_det i dodjeljuje vrijednost lv_emp_name.
- Redak koda 9: Korištenje atributa kursora '% NOTFOUND' da biste pronašli je li dohvaćen sav zapis u kurzoru. Ako se dohvati, vratit će 'TRUE', a kontrola će izaći iz petlje, u suprotnom će kontrola i dalje dohvaćati podatke iz kursora i ispisivati podatke.
- Linijska oznaka 11: uvjet EXIT za naredbu petlje.
- Redak koda 12: Ispišite dohvaćeno ime zaposlenika.
- Redak 14: Korištenje atributa kursora '% ROWCOUNT' za pronalaženje ukupnog broja zapisa koji su pogođeni / dohvaćeni u kurzoru.
- Redak koda 15: Nakon izlaska iz petlje kursor se zatvara, a dodijeljena memorija oslobađa.
ZA Izjavu kursora petlje
Izraz "FOR LOOP" može se koristiti za rad s kursorima. Ime kursora možemo dati umjesto ograničenja raspona u naredbi petlje FOR, tako da će petlja raditi od prvog zapisa kursora do zadnjeg zapisa kursora. Varijabla kursora, otvaranje kursora, dohvaćanje i zatvaranje kursora implicitno će se izvršiti pomoću petlje FOR.
Sintaksa:
DECLARECURSORIS
- U gornjoj sintaksi, dio deklaracije sadrži deklaraciju kursora.
- Kursor se kreira za izraz 'SELECT' koji je dan u deklaraciji kursora.
- U izvršnom dijelu, deklarirani kursor je postavljen u FOR petlju, a varijabla petlje 'I' u ovom će se slučaju ponašati kao varijabla kursora.
Primjer 1 : U ovom ćemo primjeru projicirati cijelo ime zaposlenika iz emp tablice pomoću petlje kursora-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Izlaz
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Objašnjenje koda:
- Redak koda 2 : Deklariranje kursora guru99_det za izraz "SELECT emp_name FROM emp".
- Redak koda 4 : Konstruiranje petlje 'FOR' za kursor s varijablom petlje lv_emp_name.
- Redak koda 5: Ispis imena zaposlenika u svakoj iteraciji petlje.
- Redak koda 8: Izađite iz petlje
Napomena: U petlji Cursor-FOR atributi kursora ne mogu se koristiti jer se otvaranje, dohvaćanje i zatvaranje kursora implicitno vrši pomoću petlje FOR.