Ano, můžete to udělat pomocí DBMS_SQL.TO_CURSOR_NUMBER funkce. Váš postup bude vypadat takto:
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);
...
Pak to musíte nazvat takto:
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);
OTEVŘÍT PRO
Příkaz umožňuje CLOB
jako prohlášení, takže neexistuje žádné praktické omezení, pokud jde o velikost.
Protože v době návrhu nevíte, které sloupce budou vybrány (alespoň to předpokládám), neexistuje způsob, jak se zbavit DBMS_SQL.DESCRIBE_COLUMNS
a DBMS_SQL.DEFINE_COLUMN
. Jinak můžete použít FETCH Statement
místo DBMS_SQL.FETCH_ROWS(c)