为什么我的功能表不可接受?

时间:2013-05-13 05:45:08

标签: sql function sql-types

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);”时,系统会告诉我存在“无效的数据类型”。我不确定是什么带来了这个问题。

1 个答案:

答案 0 :(得分:2)

此类型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);您将获得所需的结果。