2017-10-05 67 views
0

我有返回遊標我的包是這樣如何使一個選擇從從PLSQL函數ORACLE

FUNCTION SEDIRUNTIME (sede varchar2) return SYS_REFCURSOR

此光標返回X僅用一個號碼行的函數返回一個指針值,例如:

ROW1 - 34 
ROW2 - 55 
ROW3 - 56 ecc. ecc. 

現在我有我選擇這樣

.. AND field in (select DBK_ENIN_REPORT.*SEDIRUNTIME*(sede) from dual) 

這將模擬子句IN我們可以在運行時知道這些值。

例如,基於位置的參數,光標可以給我22和34,而不是僅僅56或78 98 09.

寫入,所以我不從錯誤編號00932不相干數據類型工作。

解決方案?

+0

另請參閱https://stackoverflow.com/questions/18035778/select-data-from-cursor-of-package-print-it和https://stackoverflow.com/questions/20415107/how-to-fetch -Oracle參考光標 - 進入 - 表可變 – MT0

回答

0

嗯,我會說你CAN做但你需要twist一點點。你可以看到我如何做到如下。我以僱員表爲例。

創建功能:

CREATE OR REPLACE FUNCTION SEDIRUNTIME (sede VARCHAR2) 
    RETURN SYS_REFCURSOR 
AS 
    cur SYS_REFCURSOR; 
BEGIN 
    OPEN cur FOR SELECT employee_id FROM employee; 

    RETURN cur; 
END; 
/

匿名塊,你可以在你的包作爲程序執行;

DECLARE 
    x  SYS_REFCURSOR; 
    y  NUMBER; 
    v  VARCHAR2 (100); 
    v_sql VARCHAR2 (200); 

    TYPE var_emp IS TABLE OF employee%ROWTYPE 
     INDEX BY PLS_INTEGER; 

    v_emp var_emp; 
BEGIN 
    x := SEDIRUNTIME ('sede'); 

    LOOP 
     FETCH x INTO y; 

     v := v || ',' || y; 

     EXIT WHEN x%NOTFOUND; 
    END LOOP; 
    --Created the IN clause list 
    v := LTRIM (v, ','); 

    v_sql := 'Select * from employee where employee_id in (' || v || ')'; 

    EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_emp; 

    FOR i IN 1 .. v_emp.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line (v_emp (i).employee_id || '--' || v_emp (i).first_name); 
    END LOOP; 
END; 

OUTPUT:

SQL>/
1--XXX 
2--YYY 

PL/SQL procedure successfully completed. 

SQL> 

PS:Ofcourse通過MTO提供的解決方案將是更快,這。

0

你不能使用這樣的CURSOR

但你可以改變函數返回一個集合:

CREATE TYPE Numberlist IS TABLE OF NUMBER; 
/

CREATE FUNCTION DBK_ENIN_REPORT.SEDIRUNTIME (
    sede varchar2 
) return NumberList 
IS 
    out_numbers NumberList; 
BEGIN 
    SELECT id 
    BULK COLLECT INTO out_numbers 
    FROM your_table; 

    RETURN out_numbers; 
END; 
/

然後,你可以這樣做:

.. AND field MEMBER OF DBK_ENIN_REPORT.SEDIRUNTIME(sede) 

.. AND field IN (SELECT COLUMN_VALUE FROM TABLE(DBK_ENIN_REPORT.SEDIRUNTIME(sede)))