【问题标题】:Returning a table from an Oracle function从 Oracle 函数返回表
【发布时间】:2012-09-02 13:05:30
【问题描述】:

我在这里查看了许多解决方案来尝试解决这个问题,他们已经走了很远,但现在我陷入了一些我似乎无法克服的错误中。

我使用的是 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 行上无效使用类型名称或子类型名称

我对表格类型做错了什么?

【问题讨论】:

  • 如果您正在执行插入/更新或删除操作,请使用存储过程而不是函数。
  • 我需要将结果连接到其他表,我不相信我可以在连接子句中使用 SP。

标签: oracle function plsql oracle11g


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答!您已经删除了elsif,它什么也没做。我认为这是 OP 部分的编码错误,而不是其他任何东西......
  • 感谢您的回复。我错过了这是一个集合。不过,有一个后续问题,您是否看到从函数返回表的更直接的方法?我实际上是在转换使用不易转换为 PLSQL 的表值函数的 TSQL 代码。
  • 已将 ELSIF 更正为相关,这是一个对话错误。实际的 SQL 大约有 6 个 ELSIF,没想到没有必要全部发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2011-05-06
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多