3

我正在寻找从 Oracle 函数返回结果表。使用游标是最简单的,但我必须将其用于的应用程序不会接受游标作为返回值。另一种方法是创建一个类型(可能包装在一个包中)来配合这个函数。但是,创建几种类型(我有 4 个以上的函数要编写)似乎有点多余,以便我可以返回表结果。有没有我想念的替代方案?

4

2 回答 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 回答