从Oracle函数返回表

时间:2012-09-09 11:09:46

标签: oracle function plsql oracle11g

我在这里看了很多解决方案,试图解决这个问题,他们已经走得很远,但现在我已经处理了一些我似乎无法解决的错误。

我使用的是Oracle 11g。我需要一个函数来返回一个记录集(表)。这是我正在使用的代码:

CREATE TYPE T_TABLE IS OBJECT
(
    Field1 int
    , Field2 int
);

CREATE TYPE T_TABLE_COLL IS TABLE OF T_TABLE;

CREATE OR REPLACE FUNCTION FN_MyFunction
RETURN T_TABLE_COLL 
IS
BEGIN
  FOR I IN (SELECT Field1, Field2 FROM Table1) LOOP
    IF I.Field1 = 1 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;
    ELSIF I.Field1 = 2 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;  
  END IF;
  END LOOP;
  RETURN T_SMRYACCT_TABLE_COLL;
END;

我从中收到的错误是:

  1. 在FUNCTION FN_MyFunction行和PL / SQL上忽略语句:ORA-04044:每行上不允许执行过程,函数,包或类型INSERT INTO T_TABLE_COLL行

  2. PLS-00330:在RETURN行上无效使用类型名称或子类型名称

  3. 表格类型我做错了什么?

1 个答案:

答案 0 :(得分:5)

T_TABLE_COLL是一个集合。您不能在集合上使用插入

CREATE OR REPLACE FUNCTION FN_MyFunction
RETURN T_TABLE_COLL
IS
  l_res_coll T_TABLE_COLL;
  l_index number;
BEGIN
  l_res_coll := T_TABLE_COLL();
  FOR I IN (SELECT col1, col2 FROM Table1)
  LOOP
    IF I.col1 = 1 THEN
      l_res_coll.extend;
      l_index := l_res_coll.count;  
      l_res_coll(l_index):= T_TABLE(i.col1, i.col2);
    END IF;
  END LOOP;
  return l_res_coll;
END;

行动中的功能

select *
  from table(FN_MyFunction())

要获取有关集合是什么以及如何使用它们的更多信息,请阅读this