将类型返回为不使用Oracle函数的表



我有下面的包和函数结构,需要了解是否可能。

如果是,那么请帮助我理解我哪里出了问题。

程序包->

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>

最新更新