Sí, puede hacerlo con DBMS_SQL.TO_CURSOR_NUMBER función. Su procedimiento se verá así:
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);
...
Entonces tienes que llamarlo así:
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);
ABIERTO PARA
Declaración permite CLOB
como declaración, por lo que no hay límite práctico en términos de tamaño.
Dado que no sabe en el momento del diseño qué columnas se seleccionarán (al menos eso supongo), no hay forma de deshacerse de DBMS_SQL.DESCRIBE_COLUMNS
y DBMS_SQL.DEFINE_COLUMN
. De lo contrario, puede usar Declaración FETCH
en lugar de DBMS_SQL.FETCH_ROWS(c)