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類型的結果集:
首先定義一個行類型:
CREATE OR REPLACE TYPE "SPLIT_ARR" AS OBJECT(nowStr varchar2 ( 18 ))
其次以此行類型定義一個表類型:
CREATE OR REPLACE TYPE "SPLIT_TAB" AS TABLE of split_arr;
定義函數(此函數完成字串拆分功能):
CREATE OR REPLACE FUNCTION GetSubStr(
str in varchar2 , -- 待分割的字串
splitchar in varchar2 -- 分割標誌
)
return split_tab
IS
restStr varchar2 ( 2000 ) default GetSubStr. str ; -- 剩餘的字串
thisStr varchar2 ( 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 ;
if indexStr = 1 then -- -第一個字元便為分隔字元,此時去掉分隔字元
begin
restStr : = substr(restStr, 2 );
goto top ;
end ;
end if ;
if length(restStr) = 0 or restStr is null then
return v;
end if ;