Ya, Anda dapat melakukannya dengan DBMS_SQL.TO_CURSOR_NUMBER fungsi. Prosedur Anda akan terlihat seperti ini:
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);
...
Maka Anda harus menyebutnya seperti ini:
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);
BUKA UNTUK
Pernyataan memungkinkan CLOB
sebagai pernyataan, jadi tidak ada batasan praktis dalam hal ukuran.
Karena Anda tidak tahu pada waktu desain kolom mana yang akan dipilih (setidaknya saya berasumsi demikian) tidak ada cara untuk menghilangkan DBMS_SQL.DESCRIBE_COLUMNS
dan DBMS_SQL.DEFINE_COLUMN
. Jika tidak, Anda dapat menggunakan FETCH Statement
bukannya DBMS_SQL.FETCH_ROWS(c)