sql >> Base de Datos >  >> RDS >> Oracle

Devuelve la instrucción SQL de un cursor explícito

Sí, puede hacerlo con DBMS_SQL.TO_CURSOR_NUMBER función. Su procedimiento se verá así:

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);
    ...

Entonces tienes que llamarlo así:

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);

ABIERTO PARA Declaración permite CLOB como declaración, por lo que no hay límite práctico en términos de tamaño.

Dado que no sabe en el momento del diseño qué columnas se seleccionarán (al menos eso supongo), no hay forma de deshacerse de DBMS_SQL.DESCRIBE_COLUMNS y DBMS_SQL.DEFINE_COLUMN . De lo contrario, puede usar Declaración FETCH en lugar de DBMS_SQL.FETCH_ROWS(c)