Function怎么返回一个数据集,Table

1.CREATE OR REPLACE PACKAGE ROME AS
AS
TYPE RefCursor IS REF CURSOR;
Function GetCompany(key IN char) return RefCursor;
END;
/
CREATE OR REPLACE PACKAGE BODY ROME IS
IS
Function GetCompany(key IN char) return RefCursor
Is
v_temp RefCursor;
BEGIN
OPEN v_temp FOR
SELECT * FROM Company WHERE com_ID =key;
return v_temp;
END GetCompany;
END;
  
2.(适用于PLSQL类型)
Type shifts_ty is RECORD(
     comp_code    varchar2(10),
     SHIFT_CODE    varchar2(10),  
     sft_flg        varchar2(10),
     beg_tm        number,
     end_tm        number,
     skills        varchar2(10)) ;
Type shifts is Table of shifts_ty index by binary_integer;
  
FUNCTION test_proc(test varchar2)
  
return shifts is
shiftspkg SHIFTS;   --表变量shiftspkg
  
cursor q1 is select  
shifts.comp_code,shifts.shift_code,shifts.WRK_BEG_TM,shifts.WRK_end_TM,
shifts.skills from str_shifts shifts where comp_code ='TSI';  --str_shifts是与表变量shiftspkg结构完全相同的真实表
qty q1%rowtype;
begin
  
     open q1;
     loop
         fetch q1 into qty;
         exit when q1%notfound;
      
         for iCount in 1.. qty.skills.count
         loop
             shiftspkg(icount).comp_code:= qty.comp_code;
             shiftspkg(icount).SHIFT_CODE:= qty.shift_code;
             shiftspkg(icount).sft_flg:= 'SLOTS';
             shiftspkg(icount).beg_tm:= qty.wrk_beg_tm;
             shiftspkg(icount).end_tm:= qty.wrk_end_tm;
             shiftspkg(icount).skills:= qty.skills(icount);
         end loop;
     end loop;
     return    shiftspkg;
end;
end;
  
3.使用于SQL类型
  
create or replace type myScalarType as object
    ( comp_code varchar2(10),
      shift_code varchar2(10),
      sft_flg        varchar2(10),
      beg_tm        number,
      end_tm        number,
      skills        varchar2(10)
       )
  
create or replace type myArrayType as table of myScalarType
   
     
FUNCTION test_proc(test varchar2) return myArrayType
     is
         l_data  myArrayType := myArrayType()  ;
     begin
        for i in 1 .. 5
        loop
            l_data.extend;
            l_data( l_data.count ) := myScalarType( 'cc-'||i,
                                                    'sc-'||i,
                                                    'flg-'||i,
                                                    i,
                                                    i,
                                                    test||i );
        end loop;
     
        return l_data;
    end;
     
    end;
  
select *
       from THE ( select cast( pkg_test.test_proc('hello') as myArrayType )
                    from dual ) a

select *
       from table ( cast( my_function() as mytabletype   ) )
      order by seq




PL/SQL:
CREATE OR REPLACE PACKAGE SCOTT."PKG_TEST" as
/* 定义ref cursor类型
    不加return类型,为弱类型,允许动态sql查询,
    否则为强类型,无法使用动态sql查询;
*/
   type myrctype is ref cursor;  
   
--函数申明
   function get(StrBarcode VARCHAR ) return myrctype;
end pkg_test;
CREATE OR REPLACE PACKAGE BODY SCOTT."PKG_TEST" as
--函数体
    function get(StrBarcode VARCHAR )  return myrctype is      
      rc myrctype;  --定义ref cursor变量
      sqlstr varchar2(500);
    begin
         sqlstr := 'SELECT * FROM 表名 where 某字段=:id';
         --动态测试,用sqlstr字符串返回结果,用using关键词传递参数
         open rc for sqlstr using StrBarcode;
      return rc;
    end get;   
end pkg_test;






最简单的例子 PL/SQL 代码:
CREATE OR REPLACE PACKAGE "PKG_TEST" AS
       TYPE myrcType IS REF CURSOR;
       FUNCTION get(strSQL VARCHAR) RETURN myrcType;
END pkg_test;

CREATE OR REPLACE PACKAGE BODY "PKG_TEST" AS
    FUNCTION get(strSQL IN VARCHAR) RETURN myrcType IS
      rc myrcType;
    BEGIN
      OPEN rc FOR strSQL;
      RETURN rc;
    END get;
END pkg_test;



 Quote:
Originally posted by zhaqiong at 2004-8-2 09:26 PM:
什么好羡慕的,也不知道哪里抄来的,错误百出!

而且函数中不能有 DML 操作,如果函数中有类似 update delete insert 等操作,
select fun_name from dual 就不允许,这样都不能用,函数返回的结果集又有什么 ...

使用自治事务就可以:
lizh@lizhdb>create or replace function test_func return varchar2 is
  2    Result int;
  3    pragma autonomous_transaction;
  4  begin
  5     insert into c values(1);
  6     commit;
  7     select count(*) into result from c;
  8    return(Result);
  9  end test_func;
10  /

函数已创建。

lizh@lizhdb>col a format a30
lizh@lizhdb>select test_func() a from dual;

A
------------------------------
5


另外增加一种Pipelined Table Functions (table function 的一种)
lizh@lizhdb>create type numset_t as table of number;
  2  /

类型已创建。

已用时间:  00: 00: 00.00
lizh@lizhdb>create function f1(x number) return numset_t pipelined i
  2  begin
  3    for i in 1..x loop
  4      pipe row(i);
  5    end loop;
  6    return;
  7  end;
  8  /

函数已创建。

已用时间:  00: 00: 00.00
lizh@lizhdb>select * from table(f1(3));

COLUMN_VALUE
------------
           1
           2
           3

已用时间:  00: 00: 00.00
lizh@lizhdb>select f1(3) from dual;

F1(3)
--------------------------------------------------------------------
NUMSET_T(1, 2, 3)

已用时间:  00: 00: 00.00
好处:从oracle文档(b10501_01)中copy的

Pipelining enables a table function to return rows faster and can reduce the memory required to cache a table function's results.
A pipelined table function can return the table function's result collection in subsets. The returned collection behaves like a stream that can be fetched from on demand. This makes it possible to use a table function like a virtual table.









posted on 2004-09-29 15:45  笨笨  阅读(3022)  评论(0编辑  收藏  举报

导航