mysql 存储过程 null的处理

qq_33608936 2017-01-22 10:59:12
BEGIN

-- 客户等级id
DECLARE level_id LONG;
-- 客户等级name
DECLARE level_name VARCHAR(50);
-- 当月总发货量
DECLARE totalFrght DECIMAL;
-- 对应客户表中的acc_id
DECLARE accId LONG;
-- 遍历数据结束标志
DECLARE done INT DEFAULT 0;

-- 游标
DECLARE cur CURSOR FOR SELECT v.COST_TOTALFRGHT ,v.ACC_ID -- FORMAT(v.COST_TOTALFRGHT/10000,2)
FROM mdm_ct_customer c LEFT JOIN v_mdm_customer_invoice_account v ON v.ACC_ID = c.ACC_ID
WHERE c.CUSTOMER_TYPE = 'customer_type_vipkh';-- <> 'customer_type_yskh';
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT found SET done=1;

-- 打开游标
OPEN cur;
-- 循环
read_loop: LOOP
-- 提取游标里的数据
FETCH cur INTO totalFrght,accId;
-- 声明声明时候结束
IF done = 1 THEN
LEAVE read_loop;
END IF;
-- 根据客户当月发货总金额计算客户等级
SELECT m.CUSTOME_LEVEL__NREC_ID,m.LEVEL_NAME INTO level_id,level_name FROM mdm_ct_customer_level_nrec m
WHERE m.MIN_LEVEL <= totalFrght and m.MAX_LEVEL > totalFrght;
-- 如果有客户等级,再修改
IF level_id IS NOT NULL THEN
-- 根据accid 修改对应客户的等级和名称
UPDATE mdm_ct_customer c SET c.CUSTOMER_LEVEL_TYPE = level_name,c.CUSTOME_LEVEL__NREC_ID =level_id
WHERE c.ACC_ID = accId;
END IF;
-- 结束循环
END LOOP;
-- 关闭游标
CLOSE cur;
END



上边的 level_id,level_name 查出来有可能 是空,我想判断下,如果是空,就不修改下边的,但是这句不起作用,IF level_id IS NOT NULL THEN,现在如果 level_id 是空的话,直接就跳出循环了。。求大神指教。。。
...全文
455 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
无心20180605 2020-04-13
  • 打赏
  • 举报
回复
引用 7 楼 qq_33608936 的回复:
[quote=引用 6 楼 gzcitizeny 的回复:] [quote=引用 5 楼 qq_33608936 的回复:] [quote=引用 4 楼 qq_35209952 的回复:] [quote=引用 2 楼 qq_33608936 的回复:] 我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
再确认一下 有数据的时候是正常的是吧? Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过. 其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧....... [/quote] 你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。
引用 4 楼 qq_35209952 的回复:
[quote=引用 2 楼 qq_33608936 的回复:] 我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
再确认一下 有数据的时候是正常的是吧? Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过. 其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧....... [/quote] 你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。 然后,我又测试了下,我只把有问题的这一个执行下,没问题,打印的是null, 但为什么一起执行,他就不对了 [/quote] 问题出现在LEFT JOIN 身上吧,c.customertype 在右表有相同值。[/quote] 不是的,他两使用acc_id关联的, 我现在解决了,但是不知道什么原因。。。 我是自己判断循环什么时候结束,然后在处理异常那里 ,把查出来的值set 成null,就好了。。 [/quote] 楼主这个解决方法给了我很大启发,解决了大麻烦,感谢楼主. 分析下楼主之前的问题,当select XX into XXX from tablename查询结果为null时,DECLARE CONTINUE HANDLER FOR NOT found SET done=1;会生效,终止循环,所以改成done>done1时,问题自然就解决了.
逗泥丸的平方 2017-01-23
  • 打赏
  • 举报
回复
存储过程对我来说还是太难了.. 老老实实写java吧......
_jant 2017-01-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_33608936 的回复:
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
你字段可以设置不为null
qq_33608936 2017-01-22
  • 打赏
  • 举报
回复
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
逗泥丸的平方 2017-01-22
  • 打赏
  • 举报
回复
查出来有可能 是空 是可能0条记录 还是说查出来是null 或者是空字符串 另外id是数值吗
gzcitizeny 2017-01-22
  • 打赏
  • 举报
回复
还是认为数据库数据有问题,最好分别查询两个表看看。
X元素 2017-01-22
  • 打赏
  • 举报
回复
楼主 这样判断一下 IF level_id IS NOT NULL THEN 改成 m.CUSTOME_LEVEL__NREC_ID 其他也类似的改一下试试 ,m.LEVEL_NAME 别用into的值
qq_33608936 2017-01-22
  • 打赏
  • 举报
回复
引用 6 楼 gzcitizeny 的回复:
[quote=引用 5 楼 qq_33608936 的回复:]
[quote=引用 4 楼 qq_35209952 的回复:]
[quote=引用 2 楼 qq_33608936 的回复:]
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null


再确认一下 有数据的时候是正常的是吧?

Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过.

其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧.......


[/quote]

你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。



引用 4 楼 qq_35209952 的回复:
[quote=引用 2 楼 qq_33608936 的回复:]
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null


再确认一下 有数据的时候是正常的是吧?

Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过.

其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧.......


[/quote]

你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。


然后,我又测试了下,我只把有问题的这一个执行下,没问题,打印的是null,



但为什么一起执行,他就不对了

[/quote]

问题出现在LEFT JOIN 身上吧,c.customertype 在右表有相同值。[/quote]

不是的,他两使用acc_id关联的,
我现在解决了,但是不知道什么原因。。。
我是自己判断循环什么时候结束,然后在处理异常那里 ,把查出来的值set 成null,就好了。。

gzcitizeny 2017-01-22
  • 打赏
  • 举报
回复
引用 5 楼 qq_33608936 的回复:
[quote=引用 4 楼 qq_35209952 的回复:] [quote=引用 2 楼 qq_33608936 的回复:] 我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
再确认一下 有数据的时候是正常的是吧? Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过. 其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧....... [/quote] 你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。
引用 4 楼 qq_35209952 的回复:
[quote=引用 2 楼 qq_33608936 的回复:] 我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
再确认一下 有数据的时候是正常的是吧? Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过. 其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧....... [/quote] 你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。 然后,我又测试了下,我只把有问题的这一个执行下,没问题,打印的是null, 但为什么一起执行,他就不对了 [/quote] 问题出现在LEFT JOIN 身上吧,c.customertype 在右表有相同值。
qq_33608936 2017-01-22
  • 打赏
  • 举报
回复
引用 4 楼 qq_35209952 的回复:
[quote=引用 2 楼 qq_33608936 的回复:]
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null


再确认一下 有数据的时候是正常的是吧?

Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过.

其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧.......


[/quote]

你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。



引用 4 楼 qq_35209952 的回复:
[quote=引用 2 楼 qq_33608936 的回复:]
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null


再确认一下 有数据的时候是正常的是吧?

Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过.

其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧.......


[/quote]

你看下这个数据,执行完应该会修改6条数据,现在到第三条就完了,而且第三条应该是没有等级的,但是他修改成普通了。


然后,我又测试了下,我只把有问题的这一个执行下,没问题,打印的是null,



但为什么一起执行,他就不对了

逗泥丸的平方 2017-01-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_33608936 的回复:
我是去另一张表查这两个字段,有可能没有记录,这两个值就是null
再确认一下 有数据的时候是正常的是吧? Windows下 level_name 这个东西可能会出事,变量名和列名冲突了,不过加了别名之后应该能过. 其他的好像也没什么感觉了.....如果能跑通应该不会有问题吧.......

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧