Oui, vous pouvez le faire avec DBMS_SQL.TO_CURSOR_NUMBER fonction. Votre procédure ressemblera à ceci :
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);
...
Ensuite, vous devez l'appeler comme ceci :
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);
OUVERT POUR
L'instruction autorise CLOB
comme déclaration, il n'y a donc pas de limite pratique en termes de taille.
Puisque vous ne savez pas au moment de la conception quelles colonnes seront sélectionnées (du moins je suppose), il n'y a aucun moyen de se débarrasser de DBMS_SQL.DESCRIBE_COLUMNS
et DBMS_SQL.DEFINE_COLUMN
. Sinon, vous pouvez utiliser instruction FETCH
au lieu de DBMS_SQL.FETCH_ROWS(c)