sql >> Databáze >  >> RDS >> Oracle

Vraťte příkaz SQL explicitního kurzoru

Ano, můžete to udělat pomocí DBMS_SQL.TO_CURSOR_NUMBER funkce. Váš postup bude vypadat takto:

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

Pak to musíte nazvat takto:

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

OTEVŘÍT PRO Příkaz umožňuje CLOB jako prohlášení, takže neexistuje žádné praktické omezení, pokud jde o velikost.

Protože v době návrhu nevíte, které sloupce budou vybrány (alespoň to předpokládám), neexistuje způsob, jak se zbavit DBMS_SQL.DESCRIBE_COLUMNS a DBMS_SQL.DEFINE_COLUMN . Jinak můžete použít FETCH Statement místo DBMS_SQL.FETCH_ROWS(c)




  1. Použití MySQL s Oracle Heterogeneous Services

  2. použití klauzule WHERE jako proměnné v dotazu MySQL nefunguje

  3. SQL Server, zavádějící XLOCK a optimalizace

  4. Přidání statické předpony na zvyšující se číslo