【问题标题】:Why the table of my function is not acceptable?为什么我的函数表不可接受?
【发布时间】:2013-05-13 05:45:07
【问题描述】:
CREATE OR REPLACE
PACKAGE PKG
AS
TYPE RESULT_T
IS
TABLE OF VARCHAR2(3000);
FUNCTION GENERATEF
RETURN RESULT_T ;
END PKG;
/
CREATE OR REPLACE
PACKAGE BODY PKG
AS
FUNCTION GENERATEF
RETURN RESULT_T
IS
i_t RESULT_T := RESULT_T();
BEGIN
FOR TLC IN 1..3
LOOP
i_t.extend;
i_t(i_t.last) := tlc;
END LOOP;
RETURN i_t;
END;
END PKG;
/
当我想执行“select * from table(pkg.GENERATEF);”时,系统告诉我有一个“无效的datatype”。我不确定是什么导致了问题。
【问题讨论】:
标签:
sql
function
sql-types
【解决方案1】:
这种类型RESULT_T 不是全局定义的,因此 Oracle(或任何 DBMS)无法识别这种类型,因此无法将输出转换为表格形式。
你可以在包外指定这个类型为-
Create or Replace TYPE RESULT_T IS
TABLE OF VARCHAR2(3000);
然后从你的包中删除这个类型的定义 -
CREATE OR REPLACE PACKAGE Pkg AS
/*TYPE RESULT_T
IS
TABLE OF VARCHAR2(3000);*/
FUNCTION Generatef RETURN Result_t;
END Pkg;
/
CREATE OR REPLACE PACKAGE BODY Pkg AS
FUNCTION Generatef RETURN Result_t IS
i_t Result_t := Result_t();
BEGIN
FOR Tlc IN 1 .. 3 LOOP
i_t.EXTEND;
i_t(i_t.LAST) := Tlc;
END LOOP;
RETURN i_t;
END;
END Pkg;
/
然后你什么时候查询 -
select * from table(pkg.GENERATEF);你会得到想要的结果。