2017-10-05 70 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)))