Oracle PL/SQL-markör: implicit, explicit, för loop med exempel

Vad är CURSOR i PL/SQL?

En markör är en pekare till detta sammanhangsområde. Oracle skapar ett sammanhangsområde för bearbetning av en SQL-sats som innehåller all information om satsen.

PL/SQL låter programmeraren styra kontextområdet genom markören. En markör håller raderna som returneras av SQL-satsen. Uppsättningen 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.

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 håller de berörda raderna i den specifika operationen. Dessa markörer kan inte namnges och därför kan de inte kontrolleras eller hänvisas från en annan plats i koden. Vi kan endast referera till den senaste markören genom markörattributen.

Explicit markör

Programmerare får skapa ett namngivet sammanhangsområde för att utföra sina DML-operationer för att få mer kontroll över det. Den explicita markören bör definieras i deklarationsdelen av PL/SQL-block, och den skapas för "SELECT"-satsen som måste användas i koden.

Nedan finns steg som involverade i att arbeta med explicita markörer.

  • Deklarerar markören Att deklarera markören innebär helt enkelt att skapa ett namngivet sammanhangsområde för 'SELECT'-satsen som definieras i deklarationsdelen. Namnet på detta sammanhangsområde är detsamma som markörnamnet.
  • Öppna markörenOm du öppnar markören instrueras PL / SQL för att tilldela minnet för denna markör. Det gör markören redo att hämta posterna.
  • Hämtar data från markörenI denna process exekveras "SELECT"-satsen och de hämtade raderna lagras i det tilldelade minnet. Dessa kallas nu aktiva uppsättningar. Att hämta data från markören är en aktivitet på rekordnivå som innebär att vi kan komma åt data på ett rekord-för-post-sätt. Varje fetch-sats hämtar en aktiv uppsättning och innehåller informationen för den specifika posten. Denna sats är samma som 'SELECT'-satsen som hämtar posten och tilldelar variabeln i 'INTO'-satsen, men den kommer inte att ge några undantag.
  • Stänger markörenNär all post har hämtats nu, måste vi stänga markören så att minnet som allokerats till detta sammanhangsområde frigörs.

syntax

DECLARE
CURSOR <cursor_name> IS <SELECT statement^>
<cursor_variable declaration>
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;
  • I ovanstående syntax innehåller deklarationsdelen markörens deklaration och markörvariabeln i vilken den hämtade datan kommer att tilldelas.
  • Markören skapas för 'SELECT'-satsen som anges i markördeklarationen.
  • I exekveringsdelen öppnas, hämtas och stängs den deklarerade markören.

Markörattribut

Både den implicita markören och den explicita markören har vissa attribut som kan nås. Dessa attribut ger mer information om marköroperationerna. Nedan finns de olika markörattributen och deras användning.

Markörattribut BESKRIVNING
%HITTADES Det returnerar det booleska resultatet 'TRUE' om den senaste hämtningsoperationen 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 det booleska resultatet 'TRUE' om den givna markören redan är öppen, annars returnerar den 'FALSE'
% ROWCOUNT Det returnerar det numeriska värdet. Det visar det faktiska antalet poster som påverkades av DML-aktiviteten.

Explicit markörexempel:

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 all post från markören.

Oracle PL/SQL-markör

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

Produktion

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

Kodförklaring

  • Kodrad 2: Deklarerar markören guru99_det för satsen 'SELECT emp_name FROM emp'.
  • Kodrad 3: Deklarerar variabel lv_emp_name.
  • Kodrad 5: Öppna markören guru99_det.
  • Kodrad 6: Ställa in Basic loop-satsen för att hämta alla poster i 'emp'-tabellen.
  • Kodrad 7: Hämtar guru99_det-data och tilldelar värdet till lv_emp_name.
  • Kodrad 9: Använd markörattributet '%NOTFOUND' för att se om all post i markören är hämtad. Om den hämtas kommer den att returnera 'TRUE' och kontroll kommer att lämna 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-satsen.
  • Kodrad 12: Skriv ut det hämtade medarbetarnamnet.
  • Kodrad 14: Använd markörattributet '%ROWCOUNT' för att hitta det totala antalet poster som har påverkats/hämtats i markören.
  • Kodrad 15: Efter att ha lämnat slingan stängs markören och det tilldelade minnet frigörs.

FOR Loop Cursor uttalande

"FOR LOOP"-satsen kan användas för att arbeta med markörer. Vi kan ge markörnamnet istället för intervallgräns i FOR loop-satsen så att loopen kommer att fungera från markörens första post till markörens sista post. Markörvariabeln, öppning av markör, hämtning och stängning av markören kommer att göras implicit av FOR-slingan.

syntax

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • I ovanstående syntax innehåller deklarationsdelen markörens deklaration.
  • Markören skapas för 'SELECT'-satsen som anges i markördeklarationen.
  • I exekveringsdelen ställs den deklarerade markören in i FOR-loopen och loopvariabeln 'I' kommer att bete sig som markörvariabel i detta fall.

Oracle Markör för loopexempel:
I det här exemplet kommer vi att projicera alla anställdas namn från emp-tabellen med hjälp av en cursor-FOR-loop.

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

Produktion

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

Kodförklaring

  • Kodrad 2: Deklarerar markören guru99_det för satsen 'SELECT emp_name FROM emp'.
  • Kodrad 4: Konstruera 'FOR'-loopen för markören med loopvariabeln lv_emp_name.
  • Kodrad 5: Skriver ut anställds namn i varje iteration av loopen.
  • Kodrad 8: Gå ur slingan

Obs: I Cursor-FOR loop kan markörattribut inte användas eftersom öppning, hämtning och stängning av markören görs implicit av FÖR slinga.