sql >> Database >  >> RDS >> Oracle

Retourneer de SQL-instructie van een expliciete cursor

Ja, dat kan met DBMS_SQL.TO_CURSOR_NUMBER functie. Uw procedure ziet er als volgt uit:

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

Dan moet je het zo noemen:

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

OPEN VOOR Verklaring staat CLOB toe als statement, dus er is geen praktische limiet qua grootte.

Aangezien je op het moment van ontwerpen niet weet welke kolommen zullen worden geselecteerd (tenminste dat neem ik aan), is er geen manier om DBMS_SQL.DESCRIBE_COLUMNS te verwijderen. en DBMS_SQL.DEFINE_COLUMN . Anders kunt u FETCH-instructie gebruiken in plaats van DBMS_SQL.FETCH_ROWS(c)




  1. Persistent versus niet-persistent - Welke moet ik gebruiken?

  2. Verbroken verbindingen bij gebruik van node.js/mysql connectionPool

  3. ORA-01882 verkrijgen:tijdzoneregio niet gevonden met Oracle UCP, op aws ec2-instantie?

  4. WHERE IS NULL, IS NOT NULL of NO WHERE-clausule, afhankelijk van de parameterwaarde van SQL Server