Příklady PLSQL kurzorů – Explicitní, implicitní a referenční kurzory
Kurzor logicky funguje jako ukazatel na výsledek soubor. Kurzorem můžete pohybovat po sadě výsledků a zpracovávat každý řádek, dokud nezjistíte, že jste na konci sady výsledků. S kurzory jsou spojeny tři typy syntaxe:vytvoření kurzoru, načítání pomocí kurzoru a zavření kurzoru. Kromě toho existuje řada atributů kurzoru, které můžete použít ve svých logických porovnáváních. V Oracle jsou následující typy kurzorů:
Explicitní kurzory
Explicitní kurzory jsou kurzory, které deklarujete a používáte.
Implicitní kurzory
PL/SQL umožňuje zahrnout příkazy SQL, včetně příkazů SELECT, jako součást kódu bez deklarace kurzoru, který se nazývá implicitní kurzor.
Referenční kurzory
Kurzor odkazuje na sadu výsledků. REF CURSOR umožňuje předat referenci kurzoru z jedné programové jednotky PL/SQL do druhé. Jinými slovy, umožňuje vám vytvořit proměnnou, která obdrží kurzor a umožní přístup k její výsledné sadě, ale v tomto blogu uvádím příklady pouze pro Explicitní a Implicitní kurzory, uvedu příklad pro Ref Cursors a Dynamický kurzor v jiném blogu .Příklad Explicit Cursor:DECLARE nemployeeid NUMBER; dstartdate DATUM; denddate DATUM; sjobid VARCHAR2 (20); -- deklarovat kurzor CURSOR curjob IS SELECT zaměstnanec_id, počáteční_datum, konec_datum, job_id FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; EXIT WEN, když curjob%NOTFOUND; DBMS_OUTPUT.put_line( 'Zaměstnanec ' || nemployeeid || 'měl práci ' || sjobid || ' pro ' || (denddate - dstartdate) || ' dny.'); KONEC SMYČKY; CLOSE curjob;END;/Stejný příklad je uveden níže pro explicitní kurzor, ale s For Loop jsou kurzory For Loop chytřejší, protože není potřeba deklarovat proměnné k načtení hodnot v nich a není třeba je otevírat nebo zavírat nebo kontrolovat, zda ukazatel je na konci kurzoru. Zde je příklad:DECLARE CURSOR curjob IS SELECT zamestnanec_id, start_date, end_date, job_id FROM hr.job_history;BEGIN FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Zaměstnanec ' || jh_rec.employee_idjh || jh_rec.employee_id || .job_id || ' pro ' || ( jh_rec.end_date - jh_rec.start_date || ' dny.')); END LOOP;END;/Příklad implicitního kurzoru:DECLARE nempno NUMBER; CURSOR curjob IS SELECT zaměstnanec_id, počáteční_datum, konec_datum, job_id FROM hr.job_history;BEGIN -- pod dotazem SQL je typ implicitního kurzoru SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Existují ' || nempno || ' záznamy o historii zaměstnanců.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Zaměstnanec ' || jh_rec.employee_id || ' měl práci ' || jh_rec.job_id || ' for ' || ( jh_rec.end_date - jh_rec. days) )); END LOOP;END;/