Да, можете да направите това с DBMS_SQL.TO_CURSOR_NUMBER функция. Вашата процедура ще изглежда така:
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);
...
След това трябва да го извикате така:
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);
ОТВОРЕНО ЗА
Изявлението позволява CLOB
като изявление, така че няма практическо ограничение по отношение на размера.
Тъй като по време на проектиране не знаете кои колони ще бъдат избрани (поне така предполагам), няма начин да се отървете от DBMS_SQL.DESCRIBE_COLUMNS
и DBMS_SQL.DEFINE_COLUMN
. В противен случай можете да използвате изявление FETCH
вместо DBMS_SQL.FETCH_ROWS(c)