加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用oracle从存储的函数中检索多行

发布时间:2021-03-16 07:07:02 所属栏目:百科 来源:网络整理
导读:我正在尝试在oracle中创建一个返回多行的存储函数. 我的问题非常类似于this one,除了我想获取select *查询 简而言之,我想创建一个返回此查询结果的函数 select * from t_email_queue 我试过的是这个: create or replacePACKAGE email_queue AS type t_ema

我正在尝试在oracle中创建一个返回多行的存储函数.

我的问题非常类似于this one,除了我想获取select *查询

简而言之,我想创建一个返回此查询结果的函数

select * from t_email_queue

我试过的是这个:

create or replace
PACKAGE email_queue AS 

  type t_email_queue_type is table of T_EMAIL_QUEUE%ROWTYPE;  

  FUNCTION lock_and_get return t_email_queue_type;

END email_queue;

create or replace
PACKAGE BODY email_queue AS 

    FUNCTION lock_and_get RETURN t_email_queue_type AS 
      queue_obj t_email_queue_type;

      cursor c (lockid in varchar2) is select * from t_email_queue where lockedby = lockid;
      lockid varchar2(100) := 'alf';
    BEGIN

      OPEN c(lockid);
      FETCH c bulk collect INTO queue_obj;

      return queue_obj;

    END lock_and_get;

END email_queue;

包编译得很好,但是当我尝试使用此查询调用它时

select * from table(email_queue.lock_and_get);

Oracle抛出以下错误

ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"
*Cause:    
*Action:
Error at Line: 1 Column: 20

我想Oracle希望我在架构级别创建我的返回类型,但是当我尝试时

create type t_email_queue_type is table of T_EMAIL_QUEUE%ROWTYPE;

甲骨文抱怨道

Type IMAIL.T_EMAIL_QUEUE_TYPE@imail dev
Error(1): PL/SQL: Compilation unit analysis terminated
Error(2,37): PLS-00329: schema-level type has illegal reference to IMAIL.T_EMAIL_QUEUE

有人能指出我正确的方向吗?我在这里错过了什么?

谢谢阅读!

解决方法

对于SQL类型,您不能执行%ROWTYPE,您必须键入每个列以匹配表*.

* sys.anydataset放在一边.但是沿着那条路走下去会有更复杂的编码.

例如如果你的桌子是

create table foo (id number,cola varchar2(1));

然后

create type email_queue_type is object (id number,cola varchar2(1));
/
create type t_email_queue_type as table of email_queue_type;
/

并使用该表email_queue_type_tab作为函数的输出.

但我建议使用流水线功能,因为您当前的代码不可扩展.

例如:

SQL> create table foo (id number,cola varchar2(1));

Table created.

SQL>
SQL> create type email_queue_type is object (id number,cola varchar2(1));
  2  /

Type created.

SQL> create type t_email_queue_type as table of email_queue_type;
  2  /

Type created.

SQL> insert into foo select rownum,'a' from dual connect by level <= 10;

10 rows created.

SQL>
SQL> create or replace PACKAGE email_queue AS
  2
  3
  4    FUNCTION lock_and_get return t_email_queue_type pipelined;
  5
  6  END email_queue;
  7  /

Package created.

SQL> create or replace PACKAGE BODY email_queue AS
  2
  3      FUNCTION lock_and_get RETURN t_email_queue_type pipelined AS
  4        queue_obj t_email_queue_type;
  5
  6      BEGIN
  7
  8       for r_row in (select * from foo)
  9              loop
 10                pipe row(email_queue_type(r_row.id,r_row.cola));
 11              end loop;
 12
 13      END lock_and_get;
 14
 15  END email_queue;
 16  /

Package body created.

SQL> select * from table(email_queue.lock_and_get());

        ID C
---------- -
         1 a
         2 a
         3 a
         4 a
         5 a
         6 a
         7 a
         8 a
         9 a
        10 a

10 rows selected.

SQL>

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!