我正在尝试编写一个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;
这几乎是(!)我想要的。现在唯一的问题是选择From dual导致结果集中只有一个条目,这个条目就是我真正想要的表。
如何让select语句解包外部结果集并只传递内部表,以便我可以沿着内部表格进行游标?
答案 0 :(得分:0)
您无法查询REF CURSOR
。一种可能的解决方案是使用PIPELINED function
和TABLE
函数(在此处阅读更多内容: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