Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gibt die SQL-Anweisung eines expliziten Cursors zurück

Ja, Sie können das mit DBMS_SQL.TO_CURSOR_NUMBER tun Funktion. Ihr Verfahren sieht folgendermaßen aus:

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

Dann müssen Sie es so aufrufen:

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

ÖFFNEN FÜR Anweisung erlaubt CLOB als Anweisung, daher gibt es keine praktische Begrenzung in Bezug auf die Größe.

Da Sie zur Entwurfszeit nicht wissen, welche Spalten ausgewählt werden (zumindest gehe ich davon aus), gibt es keine Möglichkeit, DBMS_SQL.DESCRIBE_COLUMNS loszuwerden und DBMS_SQL.DEFINE_COLUMN . Andernfalls können Sie FETCH-Anweisung verwenden statt DBMS_SQL.FETCH_ROWS(c)