Oracle Kurzor PL/SQL: Implicitní, Explicitní, pro smyčku s příkladem

Co je CURSOR v PL/SQL?

Kurzor je ukazatel na tuto kontextovou oblast. Oracle vytvoří kontextovou oblast pro zpracování příkazu SQL, která obsahuje všechny informace o příkazu.

PL/SQL umožňuje programátorovi ovládat kontextovou oblast pomocí kurzoru. Kurzor obsahuje řádky vrácené příkazem SQL. Sada řádků, které kurzor drží, se označuje jako aktivní sada. Tyto kurzory lze také pojmenovat, aby na ně bylo možné odkazovat z jiného místa kódu.

Kurzor je dvou typů.

  • Implicitní kurzor
  • Explicitní kurzor

Implicitní kurzor

Kdykoli v databázi dojde k jakékoli operaci DML, vytvoří se implicitní kurzor, který obsahuje dotčené řádky v dané konkrétní operaci. Tyto kurzory nelze pojmenovat, a proto je nelze ovládat nebo odkazovat z jiného místa kódu. Prostřednictvím atributů kurzoru můžeme odkazovat pouze na nejnovější kurzor.

Explicitní kurzor

Programátoři mohou vytvářet pojmenovanou kontextovou oblast pro provádění operací DML, aby nad ní získali větší kontrolu. Explicitní kurzor by měl být definován v deklarační části souboru PL/SQL bloka je vytvořen pro příkaz 'SELECT', který je třeba použít v kódu.

Níže jsou uvedeny kroky, které se týkají práce s explicitními kurzory.

  • Deklarace kurzoru Deklarace kurzoru jednoduše znamená vytvoření jedné pojmenované kontextové oblasti pro příkaz 'SELECT', který je definován v části deklarace. Název této kontextové oblasti je stejný jako název kurzoru.
  • Otevření kurzoruOtevření kurzoru dá pokyn PL / SQL pro přidělení paměti pro tento kurzor. Připraví kurzor k načtení záznamů.
  • Načítání dat z kurzoruV tomto procesu se provede příkaz 'SELECT' a načtené řádky se uloží do přidělené paměti. Ty jsou nyní nazývány jako aktivní sady. Načítání dat z kurzoru je aktivita na úrovni záznamu, což znamená, že k datům můžeme přistupovat způsobem záznam po záznamu. Každý příkaz načtení načte jednu aktivní sadu a obsahuje informace o tomto konkrétním záznamu. Tento příkaz je stejný jako příkaz 'SELECT', který načte záznam a přiřadí jej k proměnné v klauzuli 'INTO', ale nevyvolá žádné výjimky.
  • Zavření kurzoruJakmile je nyní načten všechen záznam, musíme zavřít kurzor, aby se uvolnila paměť přidělená této kontextové oblasti.

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;
  • Ve výše uvedené syntaxi obsahuje deklarační část deklaraci kurzoru a proměnné kurzoru, do které budou přiřazena načítaná data.
  • Kurzor je vytvořen pro příkaz 'SELECT', který je uveden v deklaraci kurzoru.
  • V prováděcí části je deklarovaný kurzor otevřen, načten a uzavřen.

Atributy kurzoru

Implicitní i explicitní kurzor má určité atributy, ke kterým lze přistupovat. Tyto atributy poskytují více informací o operacích kurzoru. Níže jsou uvedeny různé atributy kurzoru a jejich použití.

Atribut kurzoru Description
%NALEZENO Pokud poslední operace načtení úspěšně načetla záznam, vrátí logický výsledek 'TRUE', jinak vrátí FALSE.
%NENALEZENO Toto funguje opačně než %FOUND, vrátí 'TRUE', pokud poslední operace načtení nemohla načíst žádný záznam.
%JE OTEVŘENO Vrátí booleovský výsledek 'TRUE', pokud je daný kurzor již otevřen, jinak vrátí 'FALSE'
% ROWCOUNT Vrací číselnou hodnotu. Udává skutečný počet záznamů, které byly ovlivněny aktivitou DML.

Příklad explicitního kurzoru:

V tomto příkladu uvidíme, jak deklarovat, otevřít, načíst a zavřít explicitní kurzor.

Pomocí kurzoru promítneme všechna jména zaměstnance z emp tabulky. Atribut kurzoru také použijeme k nastavení smyčky na načtení všech záznamů z kurzoru.

Oracle PL/SQL kurzor

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

Výstup

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

Vysvětlení kódu

  • Řádek kódu 2: Deklarace kurzoru guru99_det pro příkaz 'SELECT emp_name FROM emp'.
  • Řádek kódu 3: Deklarování proměnné lv_emp_name.
  • Řádek kódu 5: Otevření kurzoru guru99_det.
  • Řádek kódu 6: Nastavení příkazu základní smyčky pro načtení všech záznamů v tabulce 'emp'.
  • Řádek kódu 7: Načte data guru99_det a přiřadí hodnotu lv_emp_name.
  • Řádek kódu 9: Pomocí atributu kurzoru '%NOTFOUND' zjistíte, zda je načten celý záznam v kurzoru. Pokud je načteno, vrátí 'TRUE' a ovládací prvek opustí smyčku, jinak bude ovládací prvek pokračovat v načítání dat z kurzoru a tiskne data.
  • Řádek kódu 11: EXIT podmínka pro příkaz smyčky.
  • Řádek kódu 12: Vytiskněte načtené jméno zaměstnance.
  • Řádek kódu 14: Použití atributu kurzoru '%ROWCOUNT' k nalezení celkového počtu záznamů, které byly ovlivněny/načteny v kurzoru.
  • Řádek kódu 15: Po opuštění smyčky se kurzor uzavře a přidělená paměť se uvolní.

FOR Příkaz kurzoru smyčky

Pro práci s kurzory lze použít příkaz „FOR LOOP“. V příkazu cyklu FOR můžeme místo limitu rozsahu zadat název kurzoru, takže smyčka bude fungovat od prvního záznamu kurzoru po poslední záznam kurzoru. Kurzorová proměnná, otevření kurzoru, načtení a zavření kurzoru bude provedeno implicitně smyčkou FOR.

Syntax

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • Ve výše uvedené syntaxi obsahuje deklarační část deklaraci kurzoru.
  • Kurzor je vytvořen pro příkaz 'SELECT', který je uveden v deklaraci kurzoru.
  • V prováděcí části je deklarovaný kurzor nastaven ve smyčce FOR a proměnná smyčky 'I' se v tomto případě bude chovat jako proměnná kurzoru.

Oracle Kurzor pro příklad smyčky:
V tomto příkladu promítneme všechna jména zaměstnanců z tabulky emp pomocí cyklu kurzor-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;
/

Výstup

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

Vysvětlení kódu

  • Řádek kódu 2: Deklarace kurzoru guru99_det pro příkaz 'SELECT emp_name FROM emp'.
  • Řádek kódu 4: Konstrukce smyčky 'FOR' pro kurzor pomocí proměnné smyčky lv_emp_name.
  • Řádek kódu 5: Tisk jména zaměstnance v každé iteraci smyčky.
  • Řádek kódu 8: Opusťte smyčku

Poznámka: Ve smyčce Cursor-FOR nelze atributy kurzoru použít, protože otevírání, načítání a zavírání kurzoru se provádí implicitně smyčka FOR.