Co je kurzor v oracle
Oracle K provádění příkazů SQL a ukládání informací používá pracovní oblast nazvanou Private SQL areas. Oracle Cursor je konstrukce PL/SQL, která vám umožňuje pojmenovat tyto pracovní oblasti a přistupovat k jejich uloženým informacím
Typy kurzoru v Oracle
- Implicitní kurzor v Oracle
- Explicitní kurzor v Oracle
Explicitní kurzory
Explicitní kurzory mají následující fáze
1) Declare:Deklarujeme jméno kurzoru a definujeme strukturu dotazu
2) Open: Příkaz open spustí dotaz a sváže jakoukoli proměnnou, na kterou se odkazuje. Řádky identifikované dotazem se nazývají aktivní sady. A nyní je k dispozici pro načtení
Co je aktivní sada: Sada řádků vrácených víceřádkovým dotazem
Jeho velikost je počet řádků, které splňují kritéria vyhledávání
3) Načtení:V této fázi jsou řádky načteny z kurzoru a po každém načtení otestujete kurzor na všechny zbývající řádky, pokud žádné řádky, přistoupíte k uzavření kurzoru
4) Close:Příkaz close uvolní aktivní sadu řádků a můžeme znovu otevřít kurzor pro načtení refresh aktivní sady
Podrobnosti
Vyhlášení kurzoru
- Název kurzoru
- Struktura dotazu
Syntax: CURSOR IS : It includes most of the usual clauses, but INTO Clause is not allowed Example: DECLARE CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’; ……………………………… BEGIN ……………………………… END;
Otevření kurzoru
Zde se provádí analýza a provádění dotazu. Po otevření kurzoru jsou řádky vrácené dotazem k dispozici pro načtení.
Syntax: Open <cursor name> This statement is used within the executable section of the block. It also establishes an active set of the rows Example: OPEN cur1; DECLARE v_salary number; CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’; BEGIN OPEN cur1; LOOP FETCH cur1 into v_salary; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_salary); END LOOP; CLOSE cur1; END; /
Kurzor nyní bude ukazovat na první řádek v aktivní sadě.
Načítání řádků
Po otevření kurzoru se aktuální řádek načte do proměnných. Aktuální řádek je řádek, na který aktuálně ukazuje kurzor. Načítání dat do proměnné PL/SQL nebo hostitele
Proměnná se provádí pomocí příkazu FETCH
Syntax: FETCH INTO ;
- Pro každou hodnotu sloupce vrácenou dotazem spojeným s kurzorem musí existovat
odpovídající proměnné v seznamu INTO.
- TAKÉ jejich datové typy musí být kompatibilní
ZAVŘENÍ KURZORU
Explicitně zavře kurzor a v případě potřeby jej umožňuje znovu otevřít.
Syntax: CLOSE <cursor-name>; Example: CLOSE cur1 Example of Using CLOSE <Cursor Name> DECLARE v_address emp.address%TYPE; CURSOR cur1 is select address from emp; BEGIN OPEN cur1; LOOP FETCH cur1 into v_address; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_address); END LOOP; CLOSE cur1; END; /
Explicitní atributy kurzoru
Atribut | Typ | Popis |
%ISOPEN | Booleovský | Pokud je kurzor otevřený, vyhodnotí se jako TRUE |
%NOTFOUND | Booleovský | Vyhodnocuje se jako TRUE, pokud poslední načtení nevrátí řádek |
%FOUND | Booleovský | Vyhodnocuje se jako TRUE, pokud poslední načtení vrátí řádek |
%ROWCOUNT | NUMBER | Vyhodnocuje se k celkovému počtu dosud vrácených řádků |
Pokročilý koncept s kurzorem Oracle
Oracle Cursor and Records
1)O záznamech PLSQL jsme již četli.
2) Řádky aktivní sady můžeme zpracovat také načtením hodnot do PL/SQL záznamu
3) Můžeme také definovat záznam plsql na základě vybraného seznamu sloupců v explicitních kurzorech také
Příklad
DECLARE CURSOR dept_cursor is Select deptno,dept_name FROM dept; dept_record dept_cursor%rowtype; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO dept_record; Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name); EXIT WHEN dept_cursor%notfound; END LOOP; Commit; CLOSE dept_cursor; END; /
Kurzor s parametry/parametrizovaný kurzor v oracle
Syntax: CURSOR cursor_name(parameter_name datatype, ) IS Select_statement;
1) Při otevření kurzoru a provedení dotazu předá hodnoty parametrů kurzoru
2) Otevřete explicitní kurzor několikrát s různými aktivními sadami pokaždé
Open cursor_name(parameter_value , ……);
Příklad
DECLARE CURSOR cur1(v_deptno number) is Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno; Dept_record cur1%rowtype; l_deptno number:=111; BEGIN OPEN cur1(112); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; OPEN cur1(l_deptno); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; END; /
Související články
Jak pracovat s datem v Oracle sql
Tabulky Oracle PLSQL
Vše o záznamech Oracle PLSQL
Nejčastěji kladené 25 dotazů na rozhovory s Oracle plsql
Oracle PLSQL Block Structure a Oracle PLSQL proměnná
Atributy kurzoru