Có, bạn có thể làm điều đó với DBMS_SQL.TO_CURSOR_NUMBER hàm số. Thủ tục của bạn sẽ giống như sau:
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);
...
Sau đó, bạn phải gọi nó như thế này:
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);
MỞ CHO
Câu lệnh cho phép CLOB
như tuyên bố, vì vậy không có giới hạn thực tế về kích thước.
Vì bạn không biết tại thời điểm thiết kế cột nào sẽ được chọn (ít nhất là tôi giả sử như vậy) nên không có cách nào để loại bỏ DBMS_SQL.DESCRIBE_COLUMNS
và DBMS_SQL.DEFINE_COLUMN
. Nếu không, bạn có thể sử dụng Tuyên bố FETCH
thay vì DBMS_SQL.FETCH_ROWS(c)