Čo je CURSOR v PL / SQL?
Kurzor je ukazovateľ na túto kontextovú oblasť. Oracle vytvára kontextovú oblasť na spracovanie príkazu SQL, ktorý obsahuje všetky informácie o príkaze.
PL / SQL umožňuje programátorovi ovládať kontextovú oblasť pomocou kurzora. Kurzor drží riadky vrátené príkazom SQL. Množina riadkov, ktoré drží kurzor, sa označuje ako aktívna množina. Tieto kurzory možno pomenovať aj tak, aby ich bolo možné odkazovať z iného miesta kódu.
V tomto návode sa naučíte
- Implicitný kurzor
- Explicitný kurzor
- Atribúty kurzora
- Príkaz FOR Loop Cursor
Kurzor je dvoch typov.
- Implicitný kurzor
- Explicitný kurzor
Implicitný kurzor
Kedykoľvek sa v databáze vyskytnú akékoľvek operácie DML, vytvorí sa implicitný kurzor, ktorý udrží príslušné riadky v konkrétnej operácii. Tieto kurzory nie je možné pomenovať, a teda ich nemožno ovládať ani odkazovať z iného miesta kódu. Cez atribúty kurzora môžeme odkazovať iba na najnovší kurzor.
Explicitný kurzor
Programátori môžu vytvárať pomenované oblasti kontextu na vykonávanie svojich operácií DML, aby nad nimi získali väčšiu kontrolu. Explicitný kurzor by mal byť definovaný v sekcii deklarácie bloku PL / SQL a je vytvorený pre príkaz 'SELECT', ktorý je potrebné v kóde použiť.
Ďalej sú uvedené kroky, ktoré zahŕňajú prácu s explicitnými kurzormi.
- Deklarovanie kurzora
Deklarácia kurzora jednoducho znamená vytvoriť jednu pomenovanú kontextovú oblasť pre príkaz 'SELECT', ktorý je definovaný v deklaračnej časti. Názov tejto kontextovej oblasti je rovnaký ako názov kurzora.
- Otvára sa kurzor
Otvorenie kurzora dá PL / SQL pokyn na pridelenie pamäte pre tento kurzor. Pripraví kurzor na načítanie záznamov.
- Načítanie údajov z kurzora
V tomto procese sa vykoná príkaz „SELECT“ a načítané riadky sa uložia do pridelenej pamäte. Teraz sa nazývajú ako aktívne množiny. Načítanie údajov z kurzora je aktivita na úrovni záznamu, čo znamená, že k údajom môžeme pristupovať spôsobom po záznamoch.
Každý príkaz načítania načíta jednu aktívnu množinu a uchováva informácie o konkrétnom zázname. Toto vyhlásenie je rovnaké ako vyhlásenie „SELECT“, ktoré načíta záznam a priradí ho k premennej v klauzule „INTO“, nebude však vyvolávať žiadne výnimky.
- Zatvorenie kurzora
Po načítaní celého záznamu teraz musíme zavrieť kurzor, aby sa uvoľnila pamäť pridelená tejto kontextovej oblasti.
Syntax:
DECLARECURSORIS
- Vo vyššie uvedenej syntaxi obsahuje deklaračná časť deklaráciu kurzora a premennej kurzora, do ktorej budú priradené načítané údaje.
- Kurzor je vytvorený pre príkaz 'SELECT', ktorý je uvedený v deklarácii kurzora.
- V časti vykonania sa deklarovaný kurzor otvorí, načíta a zatvorí.
Atribúty kurzora
Implicitný kurzor aj explicitný kurzor majú určité atribúty, ku ktorým je možné získať prístup. Tieto atribúty poskytujú viac informácií o operáciách kurzora. Ďalej sú uvedené rôzne atribúty kurzora a ich použitie.
Atribút kurzora | Popis |
% ZISTENÉ | Ak posledná operácia načítania priniesla záznam úspešne, vráti boolovský výsledok „TRUE“, inak vráti FALSE. |
%NENÁJDENÉ | Toto funguje opačne ako% FOUND, vráti 'TRUE', ak posledná operácia načítania nedokáže načítať žiadny záznam. |
%JE OTVORENÉ | Vráti boolovský výsledok 'TRUE', ak je daný kurzor už otvorený, inak vráti 'FALSE' |
% ROWCOUNT | Vráti číselnú hodnotu. Poskytuje skutočný počet záznamov, ktoré boli ovplyvnené aktivitou DML. |
Príklad 1 : V tomto príklade sa dozvieme, ako explicitný kurzor vyhlásiť, otvoriť, načítať a zavrieť.
Pomocou kurzora premietneme celé meno zamestnanca z emp tabuľky. Pomocou atribútu kurzora tiež nastavíme slučku na načítanie celého záznamu z kurzora.
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ýkon
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Vysvetlenie kódu:
- Riadok kódu 2 : Deklarovanie kurzora guru99_det pre príkaz „SELECT emp_name FROM emp“.
- Riadok kódu 3 : Deklarovanie premennej lv_emp_name.
- Riadok kódu 5 : Otvorenie kurzora guru99_det.
- Riadok kódu 6: Nastavenie príkazu základnej slučky na načítanie všetkých záznamov v tabuľke „emp“.
- Riadok kódu 7: Načíta údaje guru99_det a priradí hodnotu k lv_emp_name.
- Riadok kódu 9: Pomocou atribútu kurzora '% NOTFOUND' zistíte, či je načítaný celý záznam v kurzore. Ak je načítané, vráti hodnotu „TRUE“ a ovládací prvok bude ukončený zo slučky, inak bude ovládací prvok pokračovať v načítaní údajov z kurzora a údaje bude tlačiť.
- Riadok kódu 11: Podmienka EXIT pre príkaz cyklu.
- Riadok kódu 12: Vytlačte načítané meno zamestnanca.
- Riadok kódu 14: Použitie atribútu kurzora '% ROWCOUNT' na vyhľadanie celkového počtu záznamov, ktoré boli ovplyvnené / načítané v kurzore.
- Riadok kódu 15: Po opustení slučky sa kurzor zatvorí a pridelená pamäť sa uvoľní.
Príkaz FOR Loop Cursor
Pre prácu s kurzormi je možné použiť príkaz „FOR LOOP“. Vo vyhlásení slučky FOR môžeme dať namiesto limitu rozsahu názov kurzora, aby slučka fungovala od prvého záznamu kurzora po posledný záznam kurzora. Premenná kurzora, otváranie kurzora, načítanie a zatváranie kurzora bude implicitne vykonávané slučkou FOR.
Syntax:
DECLARECURSORIS
- Vo vyššie uvedenej syntaxi obsahuje deklaračná časť deklaráciu kurzora.
- Kurzor je vytvorený pre príkaz 'SELECT', ktorý je uvedený v deklarácii kurzora.
- V exekučnej časti je deklarovaný kurzor nastavený v cykle FOR a premenná cyklu „I“ sa v tomto prípade bude správať ako premenná kurzora.
Príklad 1 : V tomto príklade premietneme celé meno zamestnanca z emp tabuľky pomocou cyklu 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ýkon
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Vysvetlenie kódu:
- Riadok kódu 2 : Deklarovanie kurzora guru99_det pre príkaz „SELECT emp_name FROM emp“.
- Riadok kódu 4 : Konštrukcia slučky 'FOR' pre kurzor s premennou slučky lv_emp_name.
- Riadok kódu 5: Vytlačenie mena zamestnanca v každej iterácii cyklu.
- Riadok kódu 8: Opustite slučku
Poznámka: V cykle Cursor-FOR nie je možné použiť atribúty kurzora, pretože otváranie, načítanie a zatváranie kurzora sa vykonáva implicitne pomocou slučky FOR.