Ja, du kan göra det med DBMS_SQL.TO_CURSOR_NUMBER fungera. Din procedur kommer att se ut så här:
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);
...
Då måste du kalla det så här:
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);
ÖPPEN FÖR
Statement tillåter CLOB
som uttalande, så det finns ingen praktisk gräns vad gäller storlek.
Eftersom du inte vet vid designtillfället vilka kolumner som kommer att väljas (åtminstone antar jag det) finns det inget sätt att bli av med DBMS_SQL.DESCRIBE_COLUMNS
och DBMS_SQL.DEFINE_COLUMN
. Annars kan du använda FETCH Statement
istället för DBMS_SQL.FETCH_ROWS(c)