Může mi někdo vysvětlit, jak a kdy by měl někdo použít sys_refcursor?
Kurzor je ukazatel na sadu výsledků dotazu. Vrácením sys_refcursor
povolíte klientovi načíst tolik nebo jen málo řádků z dotazu, jak vyžaduje. Ve stavových aplikacích by to mohlo být použito k procházení výsledků.
Kurzor umožňuje větší flexibilitu než zápis funkce PL/SQL, která vrací pole, protože je zcela na klientovi, kolik řádků je třeba načíst a kdy zastavit. To znamená, že jsem nenašel mnoho případů, kdy je tato dodatečná flexibilita užitečná.
Stojí za zmínku, že sys_refcursor
je slabě zadané, takže můžete vrátit ukazatele na dotazy, které mají nejen odlišná nebo odložená klauzule, ale také různý počet a typy sloupců. Alternativně můžete použít silně zadaný kurzor, kde jsou sloupce v sadě výsledků opraveny.
To vám umožní psát funkce, které vracejí různé dotazy, například:
create function get_data ( type varchar2 ) return sys_refcursor as
ret_cur sys_refcursor;
begin
if type = 'EMP' then
open ret_cur for select * from emp;
elsif type = 'DEPT' then
open ret_cur for select * from dept;
end if;
return ret_cur;
end;
Pokud však používáte sys_refcursor
Chcete-li vytvořit obecnou funkci „otevřít dotaz“, jako výše, pravděpodobně děláte něco špatně!
Jako příklad možností: protože je zpět pl/sql, lze definovat objekt, který bude představovat řádek, definovat pl/sql tabulku těchto objektů,
create type T_MY_TABLE as table of t_my_object;
a končí
OPEN p_recordset FOR select * from table( v_my_table );
Takže namísto vytváření mongo, často hustých a/nebo kryptických přímých dotazů na databázové tabulce, lze vytvořit interní tabulku a mít plnou moc pl/sql k jejímu naplnění. A klient, který shromažďuje sadu výsledků, není moudřejší. A změna definice interní tabulky je z pohledu správy jednodušší než změna databázové tabulky.
Také při použití generátorů sestav, jako je Jasper, můžete vytlačit SQL ze sestavy a do databáze a jednoduše zavolat proceduru pro získání sady záznamů a ponechat stranu sestavy, aby se zaměřila na formátování.