sql >> Databasteknik >  >> RDS >> Oracle

Returnera SQL-satsen för en explicit markör

Ja, du kan göra det med DBMS_SQL.TO_CURSOR_NUMBER fungera. Din procedur kommer att se ut så här:

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

Då måste du kalla det så här:

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

ÖPPEN FÖR Statement tillåter CLOB som uttalande, så det finns ingen praktisk gräns vad gäller storlek.

Eftersom du inte vet vid designtillfället vilka kolumner som kommer att väljas (åtminstone antar jag det) finns det inget sätt att bli av med DBMS_SQL.DESCRIBE_COLUMNS och DBMS_SQL.DEFINE_COLUMN . Annars kan du använda FETCH Statement istället för DBMS_SQL.FETCH_ROWS(c)




  1. Hur stoppar jag tjänster på Travis CI som körs som standard?

  2. Datum för bokningssystem

  3. Behöver visa MAX COUNT av total kund genom att jämföra två tabeller

  4. MySQL-pivottabellfråga med dynamiska kolumner som trunkerar nyckelvärdet