oracle 动态游标的使用,Oracle 动态游标的使用

create or replace procedure proc_XXX(

p_iBillMonth in number,

p_tab in number,

p_nStatus out number,[@more@]

一、

create or replace procedure proc_XXX(

p_iBillMonth in number,

p_tab in number,

p_nStatus out number,

p_szErrorMsg out varchar2

)

is

type t_cur is ref cursor;

v_ser t_cur;

TYPE detail_param IS RECORD

(

acc_code number(7),

fee number(9),

time number(1),

cout number(7),

unit number(12)

);

TYPE detail_param_list IS TABLE OF detail_param INDEX BY BINARY_INTEGER;

v_noowner_detail_param_list detail_param_list;

v_owner_detail_param_list detail_param_list;

begin

v_strSql:=' select acc_id,sub_id,to_char(begin_date,''yyyymmddhh24miss''),'

||' to_char(end_date,''yyyymmddhh24miss''),detail_data,rowid from sum_noowner_'||p_iBillMonth

||' where mod(acc_id,10)='||p_tab;

open v_ser for v_strSql;

loop

<>

fetch v_ser into v_iAccId,v_iSubId,v_BeginDate,v_EndDate,v_noDetail,v_RowId;

exit when v_ser%notfound;

end loop;

close v_ser;

p_nStatus:=0;

p_szErrorMsg:='Succeed to finish proc_no2ower.';

return;

exception

when others then

p_nStatus:=-1;

p_szErrormsg:='encounter a exception,sqlcode:'||sqlcode

||',sqlerrm:'||sqlerrm||'v_sql:'||v_strSql;

return;

end proc_XXX;

------------------------------------------------------------------------------------------------------------

关于oracle中用存储过程返回动态记录集的学习

测试过程:

1、建立测试表

CREATE TABLE student

(

id NUMBER,

name VARCHAR2(30),

sex VARCHAR2(10),

address VARCHAR2(100),

postcode VARCHAR2(10),

birthday DATE,

photo LONG RAW

)

/

2、建立带ref cursor定义的包和包体及函数:

CREATE OR REPLACE

package pkg_test as

/* 定义ref cursor类型

不加return类型,为弱类型,允许动态sql查询,

否则为强类型,无法使用动态sql查询;

*/

type myrctype is ref cursor;

--函数申明

function get(intID number) return myrctype;

end pkg_test;

/

CREATE OR REPLACE

package body pkg_test as

--函数体

function get(intID number) return myrctype is

rc myrctype; --定义ref cursor变量

sqlstr varchar2(500);

begin

if intID=0 then

--静态测试,直接用select语句直接返回结果

open rc for select id,name,sex,address,postcode,birthday from student;

else

--动态sql赋值,用:w_id来申明该变量从外部获得

sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id';

--动态测试,用sqlstr字符串返回结果,用using关键词传递参数

open rc for sqlstr using intid;

end if;

return rc;

end get;

end pkg_test;

/

3、用pl/sql块进行测试:

declare

w_rc pkg_test.myrctype; --定义ref cursor型变量

--定义临时变量,用于显示结果

w_id student.id%type;

w_name student.name%type;

w_sex student.sex%type;

w_address student.address%type;

w_postcode student.postcode%type;

w_birthday student.birthday%type;

begin

--调用函数,获得记录集

w_rc := pkg_test.get(1);

--fetch结果并显示

fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;

dbms_output.put_line(w_name);

end;

4、测试结果:

通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值