はい、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);
OPEN FOR
ステートメントはCLOB
を許可します ステートメントとして、サイズに関して実際的な制限はありません。
設計時にどの列が選択されるかわからないため(少なくとも私はそう思います)、DBMS_SQL.DESCRIBE_COLUMNS
を取り除く方法はありません。 およびDBMS_SQL.DEFINE_COLUMN
。それ以外の場合は、FETCHステートメント
を使用できます。 DBMS_SQL.FETCH_ROWS(c)
の代わりに