Sì, puoi farlo con DBMS_SQL.TO_CURSOR_NUMBER funzione. La tua procedura sarà simile a questa:
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);
...
Allora devi chiamarlo così:
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);
APERTO PER
L'istruzione consente CLOB
come dichiarazione, quindi non c'è limite pratico in termini di dimensioni.
Dal momento che non sai in fase di progettazione quali colonne verranno selezionate (almeno suppongo di sì) non c'è modo di sbarazzarsi di DBMS_SQL.DESCRIBE_COLUMNS
e DBMS_SQL.DEFINE_COLUMN
. Altrimenti puoi utilizzare Dichiarazione FETCH
invece di DBMS_SQL.FETCH_ROWS(c)