如果没有自定义类型或游标,如何从Oracle函数返回表?

c90pui9n  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(125)

我希望从Oracle函数返回一个结果表。使用游标是最简单的,但是我必须在其中工作的应用程序将不接受游标作为返回值。另一种方法是创建一个类型(可能 Package 在一个包中)来沿着此函数。然而,创建几个类型(我有4个以上的函数要写)只是为了返回表结果似乎有点多余。有没有一个我错过的选择?

nkhmeac6

nkhmeac61#

**UPDATE:**参见TABLE解决方案的第一条注解,没有大小限制。

返回VARRAY或使用PIPELINED函数查询。

  • 对于VARRAY,请参阅this文章了解详细信息。代码示例:
CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30)
 /

 CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAY
 AS
   l_data EmpArray := EmpArray();
   CURSOR c_emp IS SELECT ename FROM EMP;
 BEGIN
   FOR emp_rec IN c_emp LOOP
     l_data.extend;
     l_data( l_data.count ) := emp_rec.ename;
   END LOOP;
 RETURN l_data;
END;
/

字符串

  • 对于Pipelined函数,请 checkout here。代码示例:
create or replace function Lookups_Fn return lookups_tab
   pipelined
 is
   v_row lookup_row;
 begin
   for j in 1..10
   loop
     v_row :=
       case j
         when 1 then lookup_row ( 1, 'one' )
         --...
         when 7 then lookup_row ( 7, 'seven' )
         else        lookup_row ( j, 'other' )
       end;
     pipe row ( v_row );
   end loop;
   return;
 end Lookups_Fn;
 /

 select * from table ( Lookups_Fn );

bgtovc5b

bgtovc5b2#

如果适合应用程序开发人员的话,您总是可以从函数返回XML。
在Oracle中可以通过多种方式生成XML,具体取决于您安装的是什么以及您使用的是什么版本。
XMLTYPE在某些上下文中非常有用,可以使用XMLElement、XMLAttribute、XMLAgg等从SQL生成。内置功能。如果客户机不支持XMLTYPE,则可以很容易地将其转换为CLOB值。
也许最简单的,但不是最好的(IMO)选择是使用dbms_xmlgen包:

SQL> set serveroutput on size 1000;
SQL> exec dbms_output.put_line( dbms_xmlgen.getXML( 'select * from dual' ) );

字符串
输出量:

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <DUMMY>X</DUMMY>
 </ROW>
</ROWSET>


这将为您提供一个单一的CLOB值的“表”结果。

相关问题