1

我正在尝试通过 Oracle 包中的函数返回一个表:

CREATE OR REPLACE PACKAGE test AS

    TYPE rec IS RECORD(
        col1 VARCHAR(10));

    TYPE rec_table IS TABLE OF rec;

    FUNCTION get_table(input VARCHAR2)
        RETURN rec_table
        PIPELINED;
END;

CREATE OR REPLACE PACKAGE BODY test AS

    FUNCTION get_table(input VARCHAR2)
        RETURN rec_table
        PIPELINED IS

    rec1 rec;

BEGIN
SELECT * INTO rec1
FROM
(
SELECT '1' from dual
UNION ALL
SELECT '2' from dual
);

PIPE ROW (rec1)
RETURN;
END get_table;
END;

但是当我尝试跑步时

select * from table(test.get_table('blah'))

我收到一个错误:精确提取返回的行数多于请求的行数

我读过一些关于 BULK COLLECT INTO 的内容,但我不理解语法......

4

1 回答 1

1

下面的一段代码:

SELECT '1' from dual
UNION ALL
SELECT '2' from dual

返回两条,而不是一条记录,您正试图将这两条记录放在一个rec变量中。相反,您应该循环遍历以下结果UNION

FOR v_rec IN (
  SELECT *
    FROM (
      SELECT '1' from dual
      UNION ALL
      SELECT '2' from dual
    )
  )
LOOP
  PIPE ROW (v_rec);
END LOOP;
于 2013-10-24T16:23:13.677 回答