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.