Oracle
 sql >> Database >  >> RDS >> Oracle

Restituisce l'istruzione SQL di un cursore esplicito

Sì, puoi farlo con DBMS_SQL.TO_CURSOR_NUMBER funzione. La tua procedura sarà simile a questa:

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

Allora devi chiamarlo così:

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

APERTO PER L'istruzione consente CLOB come dichiarazione, quindi non c'è limite pratico in termini di dimensioni.

Dal momento che non sai in fase di progettazione quali colonne verranno selezionate (almeno suppongo di sì) non c'è modo di sbarazzarsi di DBMS_SQL.DESCRIBE_COLUMNS e DBMS_SQL.DEFINE_COLUMN . Altrimenti puoi utilizzare Dichiarazione FETCH invece di DBMS_SQL.FETCH_ROWS(c)