函数在 select 语句中执行时应返回结果集



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

这是我到目前为止得到的:

类型引用光标:

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;

这几乎是我想要的。现在唯一的问题是"从双重选择"在结果集中只产生了一个条目,这个条目是我真正想要的表。

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

您无法查询REF CURSOR。一个可能的解决方案是使用PIPELINED functionTABLE函数(在这里阅读更多:Tim Hall 关于 PIPELINED 函数)。例:

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 函数示例

相关内容

  • 没有找到相关文章

最新更新