我有下面的包和函数结构,需要了解是否可能。
如果是,那么请帮助我理解我哪里出了问题。
程序包->
CREATE OR REPLACE PACKAGE MY_PACKAGE AS
TYPE MY_EVENTS IS TABLE OF MY_TABLE%ROWTYPE INDEX BY PLS_INTEGER ;
FUNCTION MY_FUNCTION RETURN MY_EVENTS;
END MY_PACKAGE ;
包体-->
CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS
FUNCTION MY_FUNCTION RETURN MY_EVENTS IS
EVENT_RECORDS MY_EVENTS;
BEGIN
select MT.* BULK COLLECT INTO EVENT_RECORDS from MY_TABLE MT ;
/*
some processing on EVENT_RECORDS
*/
RETURN EVENT_RECORDS ;
END MY_FUNCTION;
END MY_PACKAGE ;
我尝试调用此函数的方式-->
select MY_PACKAGE.MY_FUNCTION from dual ;
它给出错误-->
ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
*Cause:
*Action:
Error at Line: 13 Column: 8
提前感谢您的帮助!。
如果您想在SQL级别返回该类型,那么您必须在SQL级别声明它(类型(,而不是在包中。
不过,如果您从PL/SQL调用MY_FUNCTION
,它的工作方式与您所做的相同。
以下是如何做到这一点的示例:
类型:
SQL> create or replace type t_dept_row as object
2 (deptno number,
3 dname varchar2(20),
4 loc varchar2(20));
5 /
Type created.
SQL> create or replace type t_dept_tab as table of t_dept_row;
2 /
Type created.
包装:
SQL> create or replace package my_package as
2 function my_function return t_dept_tab;
3 end;
4 /
Package created.
SQL> create or replace package body my_package as
2 function my_function return t_dept_tab
3 is
4 l_tab t_dept_tab;
5 begin
6 select t_dept_row(deptno, dname, loc)
7 bulk collect into l_tab
8 from dept;
9
10 return l_tab;
11 end;
12 end;
13 /
Package body created.
测试:
SQL> select * From table(my_package.my_function);
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL>