Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Retornar a instrução SQL de um cursor explícito


Sim, você pode fazer isso com DBMS_SQL.TO_CURSOR_NUMBER função. Seu procedimento ficará assim:
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);
    ...

Então você tem que chamar assim:
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);

ABERTO PARA A declaração permite CLOB como declaração, então não há limite prático em termos de tamanho.

Como você não sabe em tempo de design quais colunas serão selecionadas (pelo menos eu suponho que sim), não há como se livrar de DBMS_SQL.DESCRIBE_COLUMNS e DBMS_SQL.DEFINE_COLUMN . Caso contrário, você pode usar a Instrução FETCH em vez de DBMS_SQL.FETCH_ROWS(c)