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

Returner SQL-sætningen for en eksplicit markør

Ja, du kan gøre det med DBMS_SQL.TO_CURSOR_NUMBER fungere. Din procedure vil se sådan ud:

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

Så skal du kalde det sådan her:

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

ÅBEN FOR Statement tillader CLOB som erklæring, så der er ingen praktisk grænse i forhold til størrelse.

Da du ikke ved på designtidspunktet, hvilke kolonner der vil blive valgt (i det mindste antager jeg det), er der ingen måde at slippe af med DBMS_SQL.DESCRIBE_COLUMNS og DBMS_SQL.DEFINE_COLUMN . Ellers kan du bruge FETCH Statement i stedet for DBMS_SQL.FETCH_ROWS(c)




  1. Flere mysql INSERT-sætninger i én forespørgsel php

  2. Tilfældig registrering fra en databasetabel (T-SQL)

  3. Hvor meget hurtigere er MyISAM sammenlignet med InnoDB?

  4. UPPER() Funktion i Oracle