【问题标题】:Function should return resultset when executed in select statement在 select 语句中执行时,函数应返回结果集
【发布时间】:2013-10-24 14:09:27
【问题描述】:

我正在尝试编写一个 pl/sql 函数,它返回一个我可以使用 select 语句检索的结果集表。

这是我目前得到的:

输入 REF CURSOR:

CREATE OR REPLACE PACKAGE types
AS
TYPE ref_cursor IS REF CURSOR;
END;

功能:

CREATE OR REPLACE FUNCTION getitems
    RETURN types.ref_cursor
AS
    mycursor types.ref_cursor;
BEGIN
    OPEN mycursor FOR 
        SELECT myid, myname, mytype 
        FROM mycategory;
    RETURN mycursor;
END getitems;

选择语句:

SELECT getitems() FROM dual;

这几乎是(!)我想要的。现在唯一的问题是 Selecting From dual 导致结果集中只有一个条目,这个条目是我真正想要的表。

如何让 select 语句打开外部结果集并仅传递内部表,以便我可以沿着内部表光标?

【问题讨论】:

    标签: oracle select plsql resultset


    【解决方案1】:

    您无法查询REF CURSOR。一种可能的解决方案是使用PIPELINED functionTABLE 函数(在此处阅读更多信息:Tim Hall about PIPELINED functions)。示例:

    CREATE TABLE emp (
      id NUMBER,
      name VARCHAR2(20)
    );
    
    INSERT INTO emp VALUES (1, 'Smith');
    INSERT INTO emp VALUES (2, 'Brown');
    
    COMMIT;
    
    CREATE OR REPLACE TYPE emp_row_t AS OBJECT (
      id NUMBER,
      name VARCHAR2(20)
    );
    
    CREATE OR REPLACE TYPE emp_tab_t IS TABLE OF emp_row_t;
    
    CREATE OR REPLACE FUNCTION piped_function RETURN emp_tab_t PIPELINED AS
    BEGIN
      FOR v_rec IN (SELECT id, name FROM emp)
      LOOP
        PIPE ROW (emp_row_t(v_rec.id, v_rec.name));
      END LOOP;
    END;
    
    -- and now query using that function
    SELECT id, name FROM TABLE(piped_function);
    

    在 SQLFiddle 检查:SQLFiddle PIPELINED function example

    【讨论】:

      最近更新 更多