2010-04-04 80 views
3

我有一个函数返回一个SYS_REFCURSOR,它有一个单行但是多列。我期望做的是能够使用SYS_REFCURSOR中返回的列值来嵌套子查询。替代的想法,如类型等,将不胜感激。下面的代码是我正在写的,并没有经过语法验证。Oracle - pl sql从SYS_REFCURSOR中选择

--Oracle function 
CREATE DummyFunction(dummyValue AS NUMBER) RETURN SYS_REFCURSOR 
IS 
    RETURN_DATA SYS_REFCURSOR; 
BEGIN 
    OPEN RETURN_DATA 
    SELECT 
    TO_CHAR(dummyValue) || 'A' AS ColumnA 
    ,TO_CHAR(dummyValue) || 'B' AS ColumnB 
    FROM 
    DUAL; 

    RETURN RETURN_DATA; 
END; 

--sample query with sub-queries; does not work 
SELECT 
    SELECT ColumnA FROM DummyFunction(1) FROM DUAL AS ColumnA 
    ,SELECT ColumnB FROM DummyFunction(1) FROM DUAL AS ColumnB 
FROM 
    DUAL; 
+0

相关:http://stackoverflow.com/questions/2059299/table-valued-functions-in-oracle-11g-parameterized-views – 2010-04-04 20:24:19

回答

4

的SYS_REFCURSOR不会达到预定可使用工作 - 你需要创建一个Oracle TYPE:

CREATE TYPE your_type IS OBJECT (
    ColumnA VARCHAR2(100), 
    ColumnB VARCHAR2(100) 
) 

更新你的函数:

CREATE DummyFunction(dummyValue AS NUMBER) 
RETURN your_type 
IS 

BEGIN 

    INSERT INTO your_type 
    SELECT TO_CHAR(dummyValue) || 'A' AS ColumnA, 
     TO_CHAR(dummyValue) || 'B' AS ColumnB 
    FROM DUAL; 

    RETURN your_type; 

END; 

然后你可以使用:

SELECT (SELECT ColumnA FROM table(DummyFunction(1))) AS ColumnA, 
     (SELECT ColumnB FROM table(DummyFunction(1))) AS ColumnB 
    FROM DUAL 

这个例子是ove rcomplicated - 所有你需要使用的是:

SELECT x.columna, 
     x.columnb 
    FROM table(DummyFunction(1)) x