Oracle中过程/函数返回结果集
http://www.cnitblog.com/wufajiaru/archive/2009/04/28/56796.html
Oracle 存儲過程返回結(jié)果集
關(guān)鍵字: 轉(zhuǎn)載
Sql代碼http://blog.csdn.net/feiliu010/article/details/1538822
Oracle中函數(shù)/過程返回結(jié)果集的幾種方式:
??? 以函數(shù)return為例,存儲過程只需改為out參數(shù)即可,在oracle 10g測試通過.
??? (1) 返回游標(biāo):
??? ??? return的類型為:SYS_REFCURSOR
??? ??? 之后在IS里面定義變量:curr SYS_REFCURSOR;
??? ??? 最后在函數(shù)體中寫:
??? ??? ?open cur for
??? ??? ??? select ......;
??? ??? ?return cur;
??? ??? 例:
??? ???
????????????????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類型的結(jié)果集:
??? ??? 首先定義一個行類型:
??? ??? ???
??? ??? 其次以此行類型定義一個表類型:
??? ??? ?
??? ??? 定義函數(shù)(此函數(shù)完成字符串拆分功能):
??? ??? ???
???????????????????str?in?varchar2,?--待分割的字符串
???????????????????splitchar?in?varchar2?--分割標(biāo)志
????????????)
????????????return?split_tab
????????????IS
??????????????restStr?varchar2(2000)?default?GetSubStr.str;--剩余的字符串
??????????????thisStr?varchar2(18);--取得的當(dāng)前字符串
??????????????indexStr?int;--臨時存放分隔符在字符串中的位置
?????????????
??????????????v?split_tab?:=?split_tab();?--返回結(jié)果
????????????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;
???????????????????
?????????????????????v.extend;
?????????????????????thisStr?:=?substr(restStr,1,indexStr?-?1);?--取得當(dāng)前的字符串
?????????????????????restStr?:=?substr(restStr,indexStr?+?1);---取剩余的字符串
?????????????????????v(v.count)?:=?split_arr(thisStr);
???????????????????END?LOOP;
?????????????????return?v;
????????????end;
??? ??? 在PL/SQL developer中可以直接調(diào)用
??? ??? ??
?????????????????????????select?nowStr?from?Table(GetSubStr('111,222,333,,,',','));
??? (3)以管道形式輸出:
??? ???
????????create?type?table_type?as?table?of?row_type;?--定義表對象
????????create?or?replace?function?test_fun(
????????????a?in?varchar2,b?in?varchar2
????????)
????????return?table_type?pipelined
????????is
????????????v?row_type;--定義v為行對象類型
????????begin
??????????for?thisrow?in?(select?a,?b?from?mytable?where?col1=a?and?col2?=?b)?loop
????????????v?:=?row_type(thisrow.a,?thisrow.b);
????????????pipe?row?(v);
??????????end?loop;
??????????return;
????????end;
????????select?*?from?table(test_fun('123','456'));
?
================================fetch into 顯示兩次
open v_cursor for ?
?select 1from dual;
?
loop
????? fetch v_cursor into v_num;
DBMS_OUTPUT.PUT_LINE(v_num);
?????exit when v_cursor%notfound;??????
????end loop;
?? ?close v_cursor;
?
將DBMS_OUTPUT.PUT_LINE(v_num); 放到exit when v_cursor%notfound;??之后就不會顯示兩次了
總結(jié)
以上是生活随笔為你收集整理的Oracle中过程/函数返回结果集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用差价Definition of 'C
- 下一篇: 在Windows XP系统登录Activ