Tak, możesz to zrobić za pomocą DBMS_SQL.TO_CURSOR_NUMBER funkcjonować. Twoja procedura będzie wyglądać tak:
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);
...
Następnie musisz to nazwać tak:
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);
OTWÓRZ DLA
Instrukcja zezwala na CLOB
jako oświadczenie, więc nie ma praktycznego ograniczenia pod względem rozmiaru.
Ponieważ nie wiesz w czasie projektowania, które kolumny zostaną wybrane (przynajmniej tak zakładam), nie ma sposobu na pozbycie się DBMS_SQL.DESCRIBE_COLUMNS
i DBMS_SQL.DEFINE_COLUMN
. W przeciwnym razie możesz użyć Oświadczenie FETCH
zamiast DBMS_SQL.FETCH_ROWS(c)