Oracle中函数/过程返回结果集的几种方式:
以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
(1) 返回游标:
return的类型为:SYS_REFCURSOR
之后在IS里面定义变量:curr SYS_REFCURSOR;
最后在函数体中写:
open cur for
select ......;
return cur;
例:
CREATE OR REPLACE FUNCTION A_Test( orType varchar2 )RETURN SYS_REFCURSOR is type_cur SYS_REFCURSOR; BEGIN OPEN type_cur FOR select col1,col2,col3 from testTable ; RETURN type_cur; END;
(2)返回table类型的结果集:
首先定义一个行类型:
CREATEORREPLACETYPE"SPLIT_ARR"ASOBJECT(nowStrvarchar2(18))
其次以此行类型定义一个表类型:
CREATETYPE"SPLIT_TAB"TABLEofsplit_arr;
FUNCTION GetSubStr(
str in varchar2,--待分割的字符串
splitchar varchar2 分割标志
)
return split_tab
IS
restStr varchar2(2000) default GetSubStr.str;剩余的字符串
thisStr 18);取得的当前字符串
indexStr int;临时存放分隔符在字符串中的位置
v split_tab := split_tab(); 返回结果
begin
dbms_output.put_line(restStr);
while length(restStr) != 0
LOOP
<<top>>
indexStr := instr(restStr,splitchar); 从子串中取分隔符的第一个位置
if indexStr = 0 and length(restStr) 0 then在剩余的串中找不到分隔符
begin
v.extend;
v(v.count) := split_arr(Reststr);
return v;
end;
end if;
1 -第一个字符便为分隔符,此时去掉分隔符
begin
restStr := substr(restStr,2);
goto top;
if length(restStr) or restStr is null then
return v;
if;
v.extend;
thisStr :1,indexStr - 1); 取得当前的字符串
restStr :+ 1);-取剩余的字符串
v(v.= split_arr(thisStr);
END LOOP;
return v;
end;