Mat*_*att 3 oracle plsql function 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;
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
在FUNCTION FN_MyFunction行和PL/SQL上忽略语句:ORA-04044:每行上不允许执行过程,函数,包或类型INSERT INTO T_TABLE_COLL行
PLS-00330:在RETURN行上无效使用类型名称或子类型名称
我对表格类型做错了什么?
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;
Run Code Online (Sandbox Code Playgroud)
功能在行动
select *
from table(FN_MyFunction())
Run Code Online (Sandbox Code Playgroud)
要获得有关集合是什么以及如何使用它们的更多信息,请阅读此内容