mysql数据库存储过程游标循环,提前退出
2015-10-13 17:02
615 查看
mysql游标遇到null提前退出
游标循环中出现 select into 赋值 为 null 的时候,循环会 提前退出,解决方法有三种1不用select into
2select aa into bb,aa改为count(aa),之后的代码由判断null改为判断0
2当赋值结果为null的时候,会自动修改循环触底的标志,所以手动在循环底部增加 set b = 1;
BEGIN /** 功能:平台收益计算 参数:结算周期 作者:高广金 2015-10-13 **/ /*产品标示,渠道标示,外部产品代码*/ DECLARE channelId, productId, outerProductId VARCHAR (64); /*申购量,赎回量,持仓量*/ DECLARE purchaseVolume, redeemVolume, positions, counts, _error,noResult INT DEFAULT 0; /*申购金额,赎回金额,持仓金额,收益率,收益金额,结息金额,盈亏金额*/ DECLARE purchaseAmount, redeemAmount, amounts, yieldRate, incomeAmount, allocatedAmount, settleAmount, profitLossAmount DOUBLE DEFAULT 0; DECLARE cur CURSOR FOR SELECT a.channel_id, a.product_id, sum(a.purchase_volume), sum(a.purchase_amount), sum(a.redeem_volume), sum(a.redeem_amount), sum(a.position), sum(a.amount) FROM c_daily_user_income a WHERE a.settle_date = settledate GROUP BY a.settle_date, a.channel_id, a.sys_id, a.product_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET noResult = 1; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING set _error=1; OPEN cur; start transaction; FETCH cur INTO channelId,productId,purchaseVolume,purchaseAmount, redeemVolume,redeemAmount, positions,amounts; REPEAT SELECT COUNT(1) INTO counts FROM c_channel_settle_param ccsp WHERE ccsp.settle_date=settledate AND ccsp.product_id=productId AND ccsp.channel_id=channelId; /*获取外部产品id*/ IF counts>0 then SELECT ccsp.product_origin INTO outerProductId FROM c_channel_settle_param ccsp WHERE ccsp.settle_date=settledate AND ccsp.product_id=productId AND ccsp.channel_id=channelId; END IF; SELECT COUNT(1) INTO counts FROM c_financial_account_flow cfaf WHERE cfaf.settle_date=settledate AND cfaf.out_produte_id=outerProductId AND cfaf.trans_type='4'; IF counts>0 then /*结息金额计算,在理财账户(B账户)流水表 */ SELECT cfaf.amount INTO settleAmount FROM c_financial_account_flow cfaf WHERE cfaf.settle_date=settledate AND cfaf.out_produte_id=outerProductId AND cfaf.trans_type='4'; END IF; SELECT COUNT(1) INTO counts from c_financial_income_data cfid WHERE cfid.settle_date=settledate AND cfid.out_product_id=outerProductId; /*总行理财产品收益数据c_financial_income_data查询出收益率*/ /*平台固定收益=持仓金额*实际收益率 */ /*收益金额income_amount=(平台固定收益+结息金额)*/ IF counts>0 then SELECT (cfid.yield_rate*amounts+settleAmount) INTO incomeAmount from c_financial_income_data cfid WHERE cfid.settle_date=settledate AND cfid.out_product_id=outerProductId; END IF; SELECT COUNT(1) INTO counts FROM c_product_income cpi WHERE cpi.settle_date=settledate AND cpi.product_id=productId; /* 分配金额=实际支付渠道金额=c_daily_user_income 的amount * 产品收益表 c_product_income(yield_rate) */ IF counts>0 then SELECT (cpi.yield_rate*amount) INTO allocatedAmount FROM c_product_income cpi WHERE cpi.settle_date=settledate AND cpi.product_id=productId; END IF; /*盈亏金额=收益金额-渠道实际支付金额*/ SET profitLossAmount=incomeAmount-allocatedAmount; /*插入*/ INSERT INTO c_platform_income (settle_date,sys_id,outer_product_id,purchase_volume,purchase_amount,redeem_volume,redeem_amount,`position`,amount,yield_rate,income_amount,settle_amount,allocated_amount,profit_loss_amount) values(settledate,'1',outerProductId,purchaseVolume,purchaseAmount,redeemVolume,redeemAmount,positions,amounts,0,incomeAmount,settleAmount,allocatedAmount,profitLossAmount); FETCH cur INTO channelId,productId,purchaseVolume,purchaseAmount, redeemVolume,redeemAmount, positions,amounts; UNTIL noResult = 1 END REPEAT; CLOSE cur; IF _error=0 THEN COMMIT; else ROLLBACK; end if; END
相关文章推荐
- 【干货】不同场景下 如何进行MySQL迁移
- Mysql 之 视图
- windows 8.1 安装 mysql 5.6 教程
- Percona MySQL5.6 半同步复制
- mysql中TimeStamp和Date的转换
- MySQL数据导出与导入
- mysql数据库重启失败,报错Binlog has bad magic number
- mysql的1067错误之一
- MySQL自学笔记——数据库的建立
- 完整删除MySQL
- mysql性能优化-慢查询分析、优化索引和配置
- MySQL group_concat_max_len
- Mysql 配置文件my.cnf详解
- MySQL Server 5.0–安装及配置/MySQLInstanceConfig.exe用法详解
- 【未完】Gearman分布式处理,mysql队列详解
- MySql:操作表的语句以及常用的字段类型
- mysql优化之参数优化
- mysql 方法或者存储过程执行慢的调试方法
- mysql分组排序
- mysql表连接总结