我正在寻找从 Oracle 函数返回结果表。使用游标是最简单的,但我必须将其用于的应用程序不会接受游标作为返回值。另一种方法是创建一个类型(可能包装在一个包中)来配合这个函数。但是,创建几种类型(我有 4 个以上的函数要编写)似乎有点多余,以便我可以返回表结果。有没有我想念的替代方案?
David Beckman
问问题
18800 次
2 回答
3
更新:请参阅没有大小限制的 TABLE 解决方案的第一条评论。
返回VARRAY或使用PIPELINED函数从它们中查询。
对于VARRAY,请参阅本文了解详细信息。那里的代码示例:
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;
结尾;
对于PiPELINED功能,请在此处查看。代码示例:
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 );
于 2009-03-03T21:37:47.897 回答
1
如果适合应用程序开发人员,您总是可以从您的函数返回 XML。
在 Oracle 中可以通过多种方式生成 XML,具体取决于您安装的内容和使用的版本。
XMLTYPE 在某些上下文中非常有用,可以使用 XMLElement、XMLAttributes、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 值的“表”结果。
于 2009-03-11T19:59:43.213 回答