Kas ir kursors PL / SQL?
Kursors ir rādītājs šai konteksta zonai. Oracle izveido konteksta apgabalu SQL priekšraksta apstrādei, kurā ir visa informācija par priekšrakstu.
PL / SQL ļauj programmētājam kontrolēt konteksta apgabalu, izmantojot kursoru. Kursors satur rindas, kuras atgriež SQL priekšraksts. Kursora turēto rindu kopa tiek saukta par aktīvo kopu. Šos kursorus var arī nosaukt, lai tos varētu novirzīt no citas koda vietas.
Šajā apmācībā jūs uzzināsiet-
- Netiešais kursors
- Skaidrs kursors
- Kursora atribūti
- FOR Loop Cursor paziņojums
Kursors ir divu veidu.
- Netiešais kursors
- Skaidrs kursors
Netiešais kursors
Ikreiz, kad datu bāzē notiek kādas DML darbības, tiek izveidots netiešs kursors, kas satur skartās rindas attiecīgajā operācijā. Šos kursorus nevar nosaukt, tāpēc tos nevar kontrolēt vai novirzīt no citas koda vietas. Caur kursora atribūtiem mēs varam atsaukties tikai uz jaunāko kursoru.
Skaidrs kursors
Programmētājiem ir atļauts izveidot nosauktu konteksta apgabalu, lai veiktu savas DML darbības, lai iegūtu lielāku kontroli pār to. Skaidrs kursors ir jādefinē PL / SQL bloka deklarācijas sadaļā, un tas ir izveidots priekšrakstam “SELECT”, kas jāizmanto kodā.
Tālāk ir norādītas darbības, kas saistītas ar darbu ar nepārprotamiem kursoriem.
- Kursora deklarēšana
Kursora deklarēšana nozīmē vienkārši izveidot vienu nosauktu konteksta apgabalu paziņojumam “SELECT”, kas definēts deklarācijas daļā. Šī konteksta apgabala nosaukums ir tāds pats kā kursora nosaukums.
- Kursora atvēršana
Atverot kursoru, PL / SQL tiks uzdots piešķirt atmiņu šim kursoram. Tas padarīs kursoru gatavu ierakstu ienešanai.
- Notiek datu iegūšana no kursora
Šajā procesā tiek izpildīts paziņojums 'SELECT', un iegūtās rindas tiek saglabātas atvēlētajā atmiņā. Tagad tos sauc par aktīvajiem kopumiem. Datu iegūšana no kursora ir ieraksta līmeņa darbība, kas nozīmē, ka mēs varam piekļūt datiem ierakstu veidā.
Katrs ielādes priekšraksts iegūs vienu aktīvo kopu un glabās konkrētā ieraksta informāciju. Šis apgalvojums ir tāds pats kā 'SELECT', kas ienes ierakstu un piešķir mainīgajam klauzulā 'INTO', taču tas neizraisīs nekādus izņēmumus.
- Kursora aizvēršana
Kad viss ieraksts tagad ir iegūts, mums jāaizver kursors, lai tiktu atbrīvota šai konteksta zonai piešķirtā atmiņa.
Sintakse:
DECLARECURSORIS
- Iepriekšminētajā sintaksē deklarācijas daļa satur kursora un kursora mainīgā deklarāciju, kurā tiks piešķirti ielādētie dati.
- Kursors tiek izveidots paziņojumam “SELECT”, kas norādīts kursora deklarācijā.
- Izpildes daļā deklarētais kursors tiek atvērts, ielādēts un aizvērts.
Kursora atribūti
Gan netiešajam kursoram, gan tiešajam kursoram ir noteikti atribūti, kuriem var piekļūt. Šie atribūti sniedz vairāk informācijas par kursora darbībām. Zemāk ir dažādi kursora atribūti un to izmantošana.
Kursora atribūts | Apraksts |
% ATRASTA | Tas atgriež Būla rezultātu “TRUE”, ja pēdējā ielādes darbība veiksmīgi ieguva ierakstu, pretējā gadījumā tā atgriezīs FALSE. |
%NAV ATRASTS | Tas darbojas pretēji% FOUND, un tas atgriezīs vērtību TRUE, ja jaunākā ienesšanas operācija nevarēja ienest nevienu ierakstu. |
% ISOPEN | Tas atgriež Būla rezultātu “TRUE”, ja dotais kursors jau ir atvērts, pretējā gadījumā tas atgriež “FALSE” |
% ROWCOUNT | Tas atgriež skaitlisko vērtību. Tas norāda faktisko ierakstu skaitu, kurus ietekmēja DML darbība. |
1. piemērs : Šajā piemērā mēs redzēsim, kā deklarēt, atvērt, ienest un aizvērt skaidru kursoru.
Izmantojot kursoru, mēs projicēsim visu darbinieka vārdu no emp tabulas. Mēs arī izmantosim kursora atribūtu, lai iestatītu cilpu, lai no kursora izgūtu visu ierakstu.
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:/
Rezultāts
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Koda skaidrojums:
- 2. koda rindiņa : paziņojuma “SELECT emp_name FROM emp” kursora deklarēšana guru99_det.
- 3. koda rinda : Deklarē mainīgo lv_emp_name.
- 5. koda rindiņa : kursora guru99_det atvēršana.
- 6. koda rindiņa: iestatot norādi Basic loop, lai iegūtu visus ierakstus tabulā 'emp'.
- Kodu rinda 7: ienes datus guru99_det un piešķir vērtību lv_emp_name.
- 9. koda rindiņa: izmantojot kursora atribūtu '% NOTFOUND', lai uzzinātu, vai viss kursora ieraksts ir ielādēts. Ja ielādēts, tas atgriezīs “TRUE” un vadīkla izies no cilpas, pretējā gadījumā vadīkla turpinās iegūt datus no kursora un izdrukāt datus.
- 11. koda rindiņa: cilpas priekšraksta nosacījums EXIT.
- 12. koda rindiņa: izdrukājiet ielādētā darbinieka vārdu.
- 14. koda rindiņa: izmantojot kursora atribūtu '% ROWCOUNT', lai atrastu kopējo ierakstu skaitu, kas tika ietekmēti / ielādēti kursorā.
- 15. koda rindiņa: Pēc iziešanas no cilpas kursors tiek aizvērts un atvēlētā atmiņa tiek atbrīvota.
FOR Loop Cursor paziņojums
"FOR LOOP" paziņojumu var izmantot darbam ar kursoriem. Mēs varam piešķirt kursora nosaukumu diapazona ierobežojuma vietā FOR cilpas paziņojumā, lai cilpa darbotos no kursora pirmā ieraksta līdz pēdējam kursora ierakstam. Kursora mainīgo, kursora atvēršanu, kursora ienešanu un aizvēršanu netieši veiks FOR cilpa.
Sintakse:
DECLARECURSORIS
- Iepriekš minētajā sintaksē deklarācijas daļa satur kursora deklarāciju.
- Kursors tiek izveidots paziņojumam “SELECT”, kas norādīts kursora deklarācijā.
- Izpildes daļā deklarētais kursors tiek iestatīts FOR cilpā, un cilpas mainīgais 'I' šajā gadījumā rīkosies kā kursora mainīgais.
1. piemērs : Šajā piemērā mēs projicēsim visu darbinieku vārdu no emp tabulas, izmantojot kursora FOR cilpu.
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;/
Rezultāts
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Koda skaidrojums:
- 2. koda rindiņa : paziņojuma “SELECT emp_name FROM emp” kursora deklarēšana guru99_det.
- 4. koda rindiņa : Kursora “FOR” cilpas konstruēšana ar cilpas mainīgo lv_emp_name.
- 5. koda rinda: darbinieka vārda drukāšana katrā cilpas atkārtojumā.
- 8. koda rindiņa: izejiet no cilpas
Piezīme: Cursor-FOR cilpā kursora atribūtus nevar izmantot, jo FOR cilpā netieši notiek kursora atvēršana, ielāde un aizvēršana.