Анонимен блок не може да върне нищо. Можете да присвоите стойности на променлива за свързване, включително тип колекция или референтен курсор, вътре в блока. Но колекцията трябва да бъде дефинирана, както и декларирана, извън блока. Тоест, трябва да е тип, който можете да използвате в обикновен SQL, а не нещо, дефинирано в PL/SQL. В момента използвате PL/SQL тип, който е дефиниран в блока, и променлива, която също е декларирана в блока - така че е извън обхвата на клиента и също не би бил валиден тип извън него . (Също така не е необходимо да се инициализира, но това е незначителен проблем).
В зависимост от това как наистина ще се използва, една опция е да използвате референтен курсор и можете да декларирате и покажете това чрез SQL*Plus или SQL Developer с variable
и print
команди. Например:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Можете да направите нещо подобно от клиентско приложение, напр. има функция, връщаща референтен курсор или процедура с изходящ параметър, който е референтен курсор, и обвържете това от приложението. След това итерирайте върху референтния курсор като набор от резултати. Но подробностите зависят от езика, който използва вашето приложение.
Друг вариант е да имате конвейерна функция, която връща тип таблица - отново дефинирана на ниво SQL (с create type
) не в PL/SQL - което може да изразходва по-малко ресурси от колекция, която се връща наведнъж.
Но трябва да се запитам защо го правиш. Казахте, че „копаенето за по-късни партиди отнема значително повече време“, което звучи така, сякаш използвате механизъм за пейджинг в заявката си, генерирайки номер на ред и след това избирайки диапазон от 100 в него. Ако вашият клиент/приложение иска да получи всички редове, тогава би било по-лесно да имате едно изпълнение на заявка, но извличане наборът от резултати в партиди.
За съжаление, без никаква информация за приложението, това са само спекулации...