Co je CURSOR v PL / SQL?
Kurzor je ukazatel na tuto kontextovou oblast. Oracle vytváří kontextovou oblast pro zpracování příkazu SQL, který obsahuje všechny informace o příkazu.
PL / SQL umožňuje programátoru ovládat kontextovou oblast pomocí kurzoru. Kurzor obsahuje řádky vrácené příkazem SQL. Sada řádků, které drží kurzor, se označuje jako aktivní sada. Tyto kurzory lze také pojmenovat, aby je bylo možné odkazovat z jiného místa kódu.
V tomto výukovém programu se naučíte-
- Implicitní kurzor
- Explicitní kurzor
- Atributy kurzoru
- Příkaz FOR Loop Cursor
Kurzor je dvou typů.
- Implicitní kurzor
- Explicitní kurzor
Implicitní kurzor
Kdykoli se v databázi vyskytnou jakékoli operace DML, vytvoří se implicitní kurzor, který obsahuje ovlivněné řádky v dané konkrétní operaci. Tyto kurzory nelze pojmenovat, a proto je nelze ovládat ani 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 mají povoleno vytvářet pojmenovanou kontextovou oblast k provádění svých operací DML, aby nad ní získali větší kontrolu. Explicní kurzor by měl být definován v sekci deklarace bloku PL / SQL a je vytvořen pro příkaz 'SELECT', který je třeba v kódu použít.
Níže jsou uvedeny kroky, které zahrnují práci s explicitními kurzory.
- Deklarace kurzoru
Deklarace kurzoru jednoduše znamená vytvořit jednu pojmenovanou kontextovou oblast pro příkaz 'SELECT', který je definován v deklarační části. Název této kontextové oblasti je stejný jako název kurzoru.
- Otevření kurzoru
Otevření kurzoru dá PL / SQL pokyn k přidělení paměti tomuto kurzoru. Připraví kurzor k načtení záznamů.
- Načítání dat z kurzoru
V tomto procesu se provede příkaz 'SELECT' a načtené řádky se uloží do přidělené paměti. Ty se nyní nazývají 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 uchovává informace o konkrétním záznamu. Toto prohlášení je stejné jako prohlášení 'SELECT', které načte záznam a přiřadí proměnné v klauzuli 'INTO', ale nebude vyvolávat žádné výjimky.
- Zavření kurzoru
Jakmile je nyní načten celý záznam, musíme zavřít kurzor, aby byla uvolněna paměť přidělená této kontextové oblasti.
Syntax:
DECLARECURSORIS
- Ve výše uvedené syntaxi obsahuje deklarační část deklaraci kurzoru a proměnné kurzoru, ke které budou přiřazena načtená data.
- Kurzor je vytvořen pro příkaz 'SELECT', který je uveden v deklaraci kurzoru.
- V prováděcí části se deklarovaný kurzor otevře, načte a zavře.
Atributy kurzoru
Implicitní kurzor i explicitní kurzor mají 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 | Popis |
%NALEZENO | Vrátí booleovský výsledek 'TRUE', pokud nejnovější operace načtení úspěšně přinesla záznam, jinak vrátí FALSE. |
%NENALEZENO | Toto funguje opačně než% FOUND, vrátí 'TRUE', pokud by poslední operace načítání 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 | Vrátí číselnou hodnotu. Poskytuje skutečný počet záznamů, které byly ovlivněny aktivitou DML. |
Příklad 1 : V tomto příkladu uvidíme, jak deklarovat, otevřít, načíst a zavřít explicitní kurzor.
Pomocí kurzoru promítneme celé jméno zaměstnance z emp tabulky. Atribut kurzoru použijeme také k nastavení smyčky k načtení celého záznamu z kurzoru.
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:/
Výstup
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal 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 : Deklarace proměnné lv_emp_name.
- Řádek kódu 5 : Otevření kurzoru guru99_det.
- Řádek kódu 6: Nastavení příkazu Basic loop, aby načetl všechny záznamy 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í hodnotu 'TRUE' a ovládací prvek bude ukončen ze smyčky, jinak bude ovládací prvek pokračovat v načítání dat z kurzoru a data vytisknout.
- Řádek kódu 11: Podmínka EXIT 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 ukončení smyčky se kurzor zavře a přidělená paměť se uvolní.
Příkaz FOR Loop Cursor
Pro práci s kurzory lze použít příkaz „FOR LOOP“. V příkazu smyčky FOR můžeme místo limitu rozsahu zadat název kurzoru, aby smyčka fungovala od prvního záznamu kurzoru po poslední záznam kurzoru. Proměnná kurzoru, otevírání kurzoru, načítání a zavírání kurzoru bude implicitně prováděno smyčkou FOR.
Syntax:
DECLARECURSORIS
- 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.
Příklad 1 : V tomto příkladu promítneme celé jméno zaměstnance z emp tabulky pomocí smyčky kurzor-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;/
Výstup
Employee Fetched:BBBEmployee Fetched:XXXEmployee 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 s proměnnou 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 použít atributy kurzoru, protože otevírání, načítání a zavírání kurzoru se provádí implicitně smyčkou FOR.