Um bloco anônimo não pode retornar nada. Você pode atribuir valores a uma variável de ligação, incluindo um tipo de coleção ou cursor de referência, dentro do bloco. Mas a coleção teria que ser definida, assim como declarada, fora do bloco. Ou seja, teria que ser um tipo que você pudesse usar em SQL simples, não algo definido em PL/SQL. No momento você está usando um tipo PL/SQL que é definido dentro do bloco e uma variável que é declarada dentro do bloco também - então está fora do escopo do cliente e também não seria um tipo válido fora dele . (Também não precisa ser inicializado, mas esse é um problema menor).
Dependendo de como ele realmente será consumido, uma opção é usar um cursor ref, e você pode declarar e exibir isso através do SQL*Plus ou SQL Developer com a
variable
e print
comandos. Por exemplo:variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Você pode fazer algo semelhante a partir de um aplicativo cliente, por exemplo. tem uma função retornando um cursor ref ou um procedimento com um parâmetro out que é um cursor ref, e vincule isso do aplicativo. Em seguida, itere sobre o cursor ref como um conjunto de resultados. Mas os detalhes dependem do idioma que seu aplicativo está usando.
Outra opção é ter uma função em pipeline que retorne um tipo de tabela - novamente definido no nível SQL (com
create type
) não em PL/SQL - o que pode consumir menos recursos do que uma coleção retornada de uma só vez. Mas eu teria que questionar por que você está fazendo isso. Você disse que "desenterrar para lotes posteriores leva muito mais tempo", o que parece que você está usando um mecanismo de paginação em sua consulta, gerando um número de linha e, em seguida, escolhendo um intervalo de 100 dentro disso. Se seu cliente/aplicativo deseja obter todas as linhas, seria mais simples ter uma única execução de consulta, mas buscar o conjunto de resultados em lotes.
Infelizmente sem nenhuma informação sobre o aplicativo isso é apenas especulação...