关于null值的一次错误小计

早晨到公司,得知有一笔资金出了问题。

了解问题后,我觉得此消息不太准确,因为此笔资金不平,数据库是会抛出一个错误以中断后续的处理。

于是来核对报表的结果,令人不爽的是,资金的确不平,但没有抛出异常。

抛出异常的语句如下:

     
select count(*) into v_count from sett_09_fundbalance
where sszjcy!=sjlk;
if(v_count!=0) then
update sett_09_fundbalance set sszjcy=sjlk-sszjcy;
commit;
RAISE_APPLICATION_ERROR(-20002,'实收资金与已付资金不一致');
else
update sett_09_fundbalance set sszjcy=sjlk-sszjcy;
commit;
end if;

但sszjcy查明为null值,所以这里没有抛出异常。我一直对null值的问题都很注意,但这次又中招了。

这是因为前面的一个更新语句所导致的连锁反应

    
update sett_09_fundbalance set (qtjyjfjyje,qtjyjfzjqsce)=
(
select sum(tp.txamt),sum(tp.txamt) from datasvr.cups_tpdet tp
where tp.tipschkflag in('1','3','4') and settledate=v_settledate
);

其中datasvr.cups_tpdet表因为没有交易,所以产生的合计是null,将之前qtjyjfjyje与qtjyjfzjqsce的默认值0,都更新为了null
而qtjyjfjyje与qtjyjfzjqsce又参与了其他的运算,从而导致了其他字段也出现null值
将更新语句更新为


update sett_09_fundbalance set (qtjyjfjyje,qtjyjfzjqsce)=
(
select sum(tp.txamt),sum(tp.txamt) from datasvr.cups_tpdet tp
where tp.tipschkflag in('1','3','4') and settledate=v_settledate
)
where exists
(
select 1 from datasvr.cups_tpdet tp
where tp.tipschkflag in('1','3','4') and settledate=v_settledate
)


就没有问题了。

1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、NULL的处理使用NVL函数。
5、比较时使用关键字用“is null”和“is not null”。
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,
count(*)中,用nvl(列名,0)处理后再查。
7、排序时比其他数据都大(索引默认是降序排列,小→大),
所以NULL值总是排在最后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值