300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Oracle中过程/函数返回结果集

Oracle中过程/函数返回结果集

时间:2018-10-15 06:34:42

相关推荐

Oracle中过程/函数返回结果集

/wufajiaru/archive//04/28/56796.html

Oracle 存储过程返回结果集

关键字: 转载

Sql代码 Oracle存储过程返回结果集 过程返回记录集:CREATEORREPLACEPACKAGEpkg_testASTYPEmyrctypeISREFCURSOR;PROCEDUREget(p_idNUMBER,p_rcOUTmyrctype);ENDpkg_test; /CREATEORREPLACEPACKAGEBODYpkg_testASPROCEDUREget(p_idNUMBER,p_rcOUTmyrctype)ISsqlstrVARCHAR2(500);BEGINIFp_id=0THENOPENp_rcFORSELECTID,NAME,sex,address,postcode,birthdayFROMstudent;ELSEsqlstr:= 'selectid,name,sex,address,postcode,birthdayfromstudentwhereid=:w_id';OPENp_rcFORsqlstrUSINGp_id;ENDIF;ENDget;ENDpkg_test; / 函数返回记录集: 建立带refcursor定义的包和包体及函数:CREATEORREPLACE packagepkg_testas/*定义refcursor类型 不加return类型,为弱类型,允许动态sql查询, 否则为强类型,无法使用动态sql查询; */ typemyrctypeisrefcursor; --函数申明functionget(intIDnumber)returnmyrctype;endpkg_test; /CREATEORREPLACE packagebodypkg_testas--函数体functionget(intIDnumber)returnmyrctypeisrcmyrctype;--定义refcursor变量 sqlstrvarchar2(500);beginifintID=0then--静态测试,直接用select语句直接返回结果openrcforselectid,name,sex,address,postcode,birthdayfromstudent;else--动态sql赋值,用:w_id来申明该变量从外部获得 sqlstr:='selectid,name,sex,address,postcode,birthdayfromstudentwhereid=:w_id'; --动态测试,用sqlstr字符串返回结果,用using关键词传递参数openrcforsqlstrusingintid;endif;returnrc;endget;endpkg_test; / =================

/feiliu010/article/details/1538822

Oracle中函数/过程返回结果集的几种方式:

以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.

(1) 返回游标:

return的类型为:SYS_REFCURSOR

之后在IS里面定义变量:curr SYS_REFCURSOR;

最后在函数体中写:

open cur for

select ......;

return cur;

例:

CREATEORREPLACEFUNCTIONA_Test(

orTypevarchar2

)RETURNSYS_REFCURSOR

is

type_curSYS_REFCURSOR;

BEGIN

OPENtype_curFOR

selectcol1,col2,col3fromtestTable;

RETURNtype_cur;

END;

(2)返回table类型的结果集:

首先定义一个行类型:

CREATEORREPLACETYPE"SPLIT_ARR"ASOBJECT(nowStrvarchar2(18))

其次以此行类型定义一个表类型:

CREATEORREPLACETYPE"SPLIT_TAB"ASTABLEofsplit_arr;

定义函数(此函数完成字符串拆分功能):

CREATEORREPLACEFUNCTIONGetSubStr(

strinvarchar2,--待分割的字符串

splitcharinvarchar2--分割标志

)

returnsplit_tab

IS

restStrvarchar2(2000)defaultGetSubStr.str;--剩余的字符串

thisStrvarchar2(18);--取得的当前字符串

indexStrint;--临时存放分隔符在字符串中的位置

vsplit_tab:=split_tab();--返回结果

begin

dbms_output.put_line(restStr);

whilelength(restStr)!=0

LOOP

<<top>>

indexStr:=instr(restStr,splitchar);--从子串中取分隔符的第一个位置

ifindexStr=0andlength(restStr)!=0then--在剩余的串中找不到分隔符

begin

v.extend;

v(v.count):=split_arr(Reststr);

returnv;

end;

endif;

ifindexStr=1then---第一个字符便为分隔符,此时去掉分隔符

begin

restStr:=substr(restStr,2);

gototop;

end;

endif;

iflength(restStr)=0orrestStrisnullthen

returnv;

endif;

v.extend;

thisStr:=substr(restStr,1,indexStr-1);--取得当前的字符串

restStr:=substr(restStr,indexStr+1);---取剩余的字符串

v(v.count):=split_arr(thisStr);

ENDLOOP;

returnv;

end;

在PL/SQL developer中可以直接调用

cursorstrcuris

selectnowStrfromTable(GetSubStr('111,222,333,,,',','));

(3)以管道形式输出:

createtyperow_typeasobject(avarchar2(10),vvarchar2(10));--定义行对象

createtypetable_typeastableofrow_type;--定义表对象

createorreplacefunctiontest_fun(

ainvarchar2,binvarchar2

)

returntable_typepipelined

is

vrow_type;--定义v为行对象类型

begin

forthisrowin(selecta,bfrommytablewherecol1=aandcol2=b)loop

v:=row_type(thisrow.a,thisrow.b);

piperow(v);

endloop;

return;

end;

select*fromtable(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;之后就不会显示两次了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。