Vad är CURSOR i PL / SQL?
En markör är en pekare till detta sammanhang. Oracle skapar kontextområde för bearbetning av ett SQL-uttalande som innehåller all information om uttalandet.
PL / SQL låter programmeraren styra sammanhangsområdet genom markören. En markör innehåller raderna som returneras av SQL-satsen. Den uppsättning rader som markören håller kallas aktiv uppsättning. Dessa markörer kan också namnges så att de kan hänvisas från en annan plats i koden.
I denna handledning lär du dig-
- Implicit markör
- Explicit markör
- Markörattribut
- FOR Loop Cursor statement
Markören är av två typer.
- Implicit markör
- Explicit markör
Implicit markör
Närhelst några DML-operationer inträffar i databasen skapas en implicit markör som innehåller de berörda raderna, i den specifika operationen. Dessa markörer kan inte namnges och därför kan de inte styras eller hänvisas från en annan plats i koden. Vi kan endast hänvisa till den senaste markören genom markörattributen.
Explicit markör
Programmerare får skapa namngivna kontextområden för att utföra sina DML-operationer för att få mer kontroll över det. Den explicita markören ska definieras i deklarationsavsnittet i PL / SQL-blocket, och den skapas för 'VÄLJ' -uttrycket som måste användas i koden.
Nedan följer steg som är involverade i arbetet med tydliga markörer.
- Markera markören
Att deklarera markören betyder helt enkelt att skapa ett namngivet sammanhang för "SELECT" -uttrycket som definieras i deklarationsdelen. Namnet på detta sammanhang är samma som markörens namn.
- Öppnande markör
Öppning av markören instruerar PL / SQL att allokera minnet till den här markören. Det gör markören redo att hämta posterna.
- Hämtar data från markören
I denna process körs 'VÄLJ' -uttrycket och raderna som hämtas lagras i det tilldelade minnet. Dessa kallas nu som aktiva uppsättningar. Att hämta data från markören är en aktivitet på postnivå som innebär att vi kan komma åt data på ett post-för-post-sätt.
Varje hämtningsuttalande hämtar en aktiv uppsättning och innehåller informationen för den aktuella posten. Detta uttalande är samma som 'SELECT' -uttryck som hämtar posten och tilldelar variabeln i 'INTO' -satsen, men det kommer inte att ge några undantag.
- Stänga markören
När alla poster har hämtats nu måste vi stänga markören så att minnet som tilldelats detta sammanhang släpps.
Syntax:
DECLARECURSORIS
- I ovanstående syntax innehåller deklarationsdelen deklarationen för markören och markörvariabeln i vilken de hämtade uppgifterna kommer att tilldelas.
- Markören skapas för uttalandet 'VÄLJ' som anges i markördeklarationen.
- I exekveringsdelen öppnas, hämtas och stängs den deklarerade markören.
Markörattribut
Både Implicit markör och den explicita markören har vissa attribut som kan nås. Dessa attribut ger mer information om markörfunktionerna. Nedan visas de olika markörattributen och deras användning.
Markörattribut | Beskrivning |
%HITTADES | Det returnerar det booleska resultatet 'SANT' om den senaste hämtningsåtgärden hämtade en post framgångsrikt, annars returnerar den FALSE. |
%HITTADES INTE | Detta fungerar motsatt till% FOUND, det kommer att returnera 'TRUE' om den senaste hämtningsoperationen inte kunde hämta någon post. |
%ÄR ÖPPEN | Det returnerar booleskt resultat 'SANT' om den givna markören redan har öppnats, annars returnerar den 'FALSE' |
% ROWCOUNT | Det returnerar det numeriska värdet. Det ger det faktiska antalet poster som påverkades av DML-aktiviteten. |
Exempel 1 : I det här exemplet ska vi se hur man deklarerar, öppnar, hämtar och stänger den explicita markören.
Vi projicerar alla anställdas namn från emp-tabellen med hjälp av en markör. Vi kommer också att använda markörattribut för att ställa in slingan för att hämta hela posten från markören.
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:/
Produktion
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Kodförklaring:
- Kodrad 2 : Förklarar markören guru99_det för uttalandet 'VÄLJ emp_name FROM emp'.
- Kodrad 3 : Förklarar variabel lv_emp_name.
- Kodrad 5 : Öppna markören guru99_det.
- Kodrad 6: Ställ in Basic loop-uttalandet för att hämta alla poster i 'emp' -tabellen.
- Kodrad 7: Hämtar data guru99_det och tilldelar värdet till lv_emp_name.
- Kodrad 9: Använd markörattributet '% NOTFOUND' för att hitta om hela posten i markören hämtas. Om den hämtas kommer den att returneras 'SANT' och kontrollen kommer att gå ut ur slingan, annars kommer kontrollen att fortsätta att hämta data från markören och skriva ut data.
- Kodrad 11: EXIT-villkor för loop-uttalandet.
- Kodrad 12: Skriv ut det hämtade medarbetarnamnet.
- Kodrad 14: Använd markörattributet '% ROWCOUNT' för att hitta det totala antalet poster som blev påverkade / hämtade i markören.
- Kodrad 15: Efter att ha lämnat slingan stängs markören och det tilldelade minnet frigörs.
FOR Loop Cursor statement
Uttrycket "FOR LOOP" kan användas för att arbeta med markörer. Vi kan ange markörnamnet istället för avståndsgränsen i FOR-slinguttrycket så att slingan fungerar från markörens första post till den sista posten i markören. Markörvariabeln, marköröppning, hämtning och stängning av markören görs implicit av FOR-slingan.
Syntax:
DECLARECURSORIS
- I ovanstående syntax innehåller deklarationsdelen markördeklarationen.
- Markören skapas för uttalandet 'VÄLJ' som anges i markördeklarationen.
- I exekveringsdelen är den deklarerade markören inställd i FOR-slingan och slingvariabeln 'I' kommer att fungera som markörvariabel i det här fallet.
Exempel 1 : I det här exemplet projicerar vi alla anställdas namn från emp-tabellen med hjälp av en cursor-FOR-loop.
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;/
Produktion
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Kodförklaring:
- Kodrad 2 : Förklarar markören guru99_det för uttalandet 'VÄLJ emp_name FROM emp'.
- Kodrad 4 : Konstruera 'FOR' -slingan för markören med slingvariabeln lv_emp_name.
- Kodrad 5: Skriv ut anställdas namn i varje iteration av slingan.
- Kodrad 8: Avsluta slingan
Obs! I Cursor-FOR-loop kan markörattribut inte användas eftersom öppning, hämtning och stängning av markören implicit görs av FOR-loop.