Oracle
 sql >> Base de données >  >> RDS >> Oracle

Renvoyer l'instruction SQL d'un curseur explicite

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)