Olá, como boa prática é recomendado utilizar cursor variable (também chamado de ref cursor), na passagem de parâmetros quando se precisa transferir um result set.
Há várias vantagens:
1 - Quando é feita passagem de SQL por parâmetro com uso de SQL dinâmico (seja nativo ou execute immediate), há uma preocupação séria com SQL injection e fraqueza nos testes, pois o SQL não é validado na compilação (grants, permissões e sintaxe do SQL) e o binding de variáveis precisa ser feito manualmente para não prejudicar o desempenho fazendo milhares de parses no banco de dados, do mesmo SQL.
2 - Passando a tabela (result set) toda via parâmetro pode parecer tentador também, mas ocupa uma área grande em memória na chamada da procedure e obriga a interface entre o banco e o programa a transferir tudo via rede, além de poder causar dores-de-cabeça na conversão de data types entre origem (Oracle) e o frontend (Delphi, Java, C#, etc).
Como sugestão, você pode usar sys_refcursor, ou um ref cursor com strong types (mais seguros e fáceis de usar).
No exemplo abaixo, usei o mais flexível, sys_refcursor, porém mais sujeito a erros de tipificação durante o fetch.
Selecionar tudo
SQL> set serveroutput on
SQL> create or replace procedure teste_param_cursor(p_cur in out sys_refcursor) as
2 begin
3 open p_cur for
4 select t.owner, t.table_name
5 from all_tables t
6 where rownum <= 10;
7 end;
8 /
Procedure created
SQL> declare
2 cur_param sys_refcursor;
3 type t_cur_all_tables is record (owner all_tables.owner%type,
4 table_name all_tables.table_name%type);
5 v_all_tables t_cur_all_tables;
6 begin
7 teste_param_cursor(cur_param);
8 loop
9 fetch cur_param
10 into v_all_tables;
11 exit when cur_param%notfound;
12 dbms_output.put_line('OWNER = ' || v_all_tables.owner || ' / TABLE = ' || v_all_tables.table_name);
13 end loop;
14 end;
15 /
OWNER = SYS / TABLE = DUAL
OWNER = SYS / TABLE = SYSTEM_PRIVILEGE_MAP
OWNER = SYS / TABLE = TABLE_PRIVILEGE_MAP
OWNER = SYS / TABLE = STMT_AUDIT_OPTION_MAP
OWNER = SYS / TABLE = WRI$_ADV_ASA_RECO_DATA
OWNER = SYSTEM / TABLE = DEF$_TEMP$LOB
OWNER = SYSTEM / TABLE = OL$
OWNER = SYSTEM / TABLE = OL$HINTS
OWNER = SYSTEM / TABLE = OL$NODES
OWNER = SYS / TABLE = IMPDP_STATS
PL/SQL procedure successfully completed
SQL>