初学写存储过程注意的

由于工作需求,一些sql总不能解决的问题,我们可以用存储过程来完成,对于我这个初学者第一次写存储过程遇到了很多问题:

1、存储过程中有专门的定义域,在begin后。有些时候你要查询数据库,而查询的条件是要在你设置之后才进行查询的,这时候照样是不能把定义该游标放在这个设置之后,其实前面定义游标只做定义,不会进行查询,只有当你取游标的时候才会进行查询,这时候你设的值自然就进去了!

2、定义游标的查询语句比较慢,或者说可能会查询会锁表,我们要用查询语句后加上with ur,防止查询锁表。

3、定义域最后可以定义异常处理

declare exit handler for sqlexception
begin
values(SQLSTATE, SQLCODE) into p_o_sqlstate, p_o_sqlcode;
set P_O_RESULT = 'EXECUTION FAILED';
end;

这里当存储过程执行异常,会自动运行到这里,讲异常状态跟code设置到相应的字段里:values(SQLSTATE, SQLCODE) into p_o_sqlstate, p_o_sqlcode

4、循环取数据的时有多种循环方法,比如

a、while do

end while;

b、cmpd1:loop

leave cmpd1;--数据没了,结束loop,离开loop

iterate cmpd1;--结束当前的,继续下一个

end loop cmpd1;

5、游标的用法,打开游标,然后取值,最后关闭,一般取游标的值都是跟循环语句联合用的

OPEN cur_mcht_day_payType_income;

FETCH cur_mcht_day_payType_income into v_merchant_id,v_total_order_amount,v_totalcount,v_fee,v_total_mcht_settle_fee,v_pay_type;

close cur_mcht_day_payType_income;

6、游标跟循环语句联合用

open cs_batch_date;
cmpd1:loop

set v_batchDate=null;
FETCH cs_batch_date INTO v_batchDate;
if v_batchDate is null then
leave cmpd1;
end if;

SET v_p_i_timestamp = char(v_batchDate)||' 00:00:00';
call MCHT_DAILY_REVENUE_REPORT(v_p_i_timestamp,P_O_SQLSTATE,P_O_SQLCODE,P_O_RESULT);
set RESULT = RESULT+1;

end loop cmpd1;

close cs_batch_date;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值