it-swarm-eu.dev

Jak a kdy použít sys_refcursor v Oracle

Může mi někdo vysvětlit, jak a kdy by měl někdo použít sys_refcursor?

9

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ě!

9
Chris Saxon

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í.

1
J Bliss