Sim, você pode fazer isso com DBMS_SQL.TO_CURSOR_NUMBER função. Seu procedimento ficará assim:
PROCEDURE run_query(p_cur IN OUT SYS_REFCURSOR) IS
...
BEGIN
c := DBMS_SQL.TO_CURSOR_NUMBER(p_cur);
-- get a description of the returned columns
DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);
...
Então você tem que chamar assim:
declare
l_cur SYS_REFCURSOR;
BEGIN
OPEN l_cur FOR
select *
from table_a
where employee_number = nvl(p_emp_no, employee_number)
and payroll_id = nvl(p_payroll_id, payroll_id);
and business_group_id = p_bg_id
...;
tabletoexcel.run_query(l_cur);
ABERTO PARA A declaração permite
CLOB
como declaração, então não há limite prático em termos de tamanho. Como você não sabe em tempo de design quais colunas serão selecionadas (pelo menos eu suponho que sim), não há como se livrar de
DBMS_SQL.DESCRIBE_COLUMNS
e DBMS_SQL.DEFINE_COLUMN
. Caso contrário, você pode usar a Instrução FETCH
em vez de DBMS_SQL.FETCH_ROWS(c)