如何使用oracle从存储的函数中检索多行
发布时间:2021-03-16 02:03:02 所属栏目:站长百科 来源:网络整理
导读:我正在尝试在oracle中创建一个返回多行的存储函数. 我的问题非常类似于this one,除了我想获取select *查询 简而言之,我想创建一个返回此查询结果的函数 select * from t_email_queue 我试过的是这个: create or replacePACKAGE email_queue AS type t_email
我正在尝试在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> (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |