gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:48:36 24 4
gpt4 key购买 nike

我正在尝试在 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 放在一边。但沿着这条路走下去,编码要复杂得多。

例如如果你的 table 是

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>

关于oracle - 如何使用oracle从存储的函数中检索多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com