Ja, du kan gøre det med DBMS_SQL.TO_CURSOR_NUMBER fungere. Din procedure vil se sådan ud:
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);
...
Så skal du kalde det sådan her:
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);
ÅBEN FOR
Statement tillader CLOB
som erklæring, så der er ingen praktisk grænse i forhold til størrelse.
Da du ikke ved på designtidspunktet, hvilke kolonner der vil blive valgt (i det mindste antager jeg det), er der ingen måde at slippe af med DBMS_SQL.DESCRIBE_COLUMNS
og DBMS_SQL.DEFINE_COLUMN
. Ellers kan du bruge FETCH Statement
i stedet for DBMS_SQL.FETCH_ROWS(c)