Anonymní blok nemůže nic vrátit. Hodnoty vazebné proměnné, včetně typu kolekce nebo referenčního kurzoru, můžete přiřadit uvnitř bloku. Kolekce by však musela být definována a také deklarována mimo blok. To znamená, že by to musel být typ, který můžete použít v prostém SQL, ne něco definovaného v PL/SQL. V tuto chvíli používáte typ PL/SQL, který je definován v rámci bloku, a proměnnou, která je deklarována také v rámci bloku – takže je mimo rozsah pro klienta a mimo něj by to nebyl platný typ. . (Také se nemusí inicializovat, ale to je menší problém).
V závislosti na tom, jak bude skutečně spotřebován, je jednou z možností použití referenčního kurzoru a můžete jej deklarovat a zobrazit prostřednictvím SQL*Plus nebo SQL Developer s variable
a print
příkazy. Například:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Něco podobného můžete udělat z klientské aplikace, např. mít funkci vracející refkurzor nebo proceduru s parametrem out, který je refkurzorem, a svázat to z aplikace. Poté iterujte přes referenční kurzor jako sadu výsledků. Podrobnosti však závisí na jazyce, který vaše aplikace používá.
Další možností je mít zřetězenou funkci, která vrací typ tabulky – opět definovaný na úrovni SQL (s create type
) ne v PL/SQL – což může spotřebovat méně prostředků než kolekce, která je vrácena najednou.
Ale musel bych se zeptat, proč to děláš. Řekli jste, že „vyhrabání pozdějších dávek zabere podstatně více času“, což zní, jako byste ve svém dotazu použili mechanismus stránkování, vygenerovali číslo řádku a pak v něm vybrali rozsah 100. Pokud chce váš klient/aplikace získat všechny řádky, bylo by jednodušší provést jeden dotaz, ale načíst sada výsledků v dávkách.
Bohužel bez jakýchkoli informací o aplikaci je to jen spekulace...