`
have23
  • 浏览: 44274 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

关于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值总是排在最后
分享到:
评论

相关推荐

    201711010202王汝芸17计2报告91

    这篇实验报告是关于Java语言程序设计的一次实践,主要涵盖了数组和哈希映射(HashMap)的使用。实验目的是为了让学生熟悉Java编程的形式,并能够独立编写完整的Java程序。实验环境中,学生使用了Windows 10操作系统...

    一个jsp计数器.zip

    这样,下次用户访问时,可以读取到上一次的值并再次累加。 三、实现JSP计数器的步骤 1. 创建JSP页面(如countTest.jsp) 在`countTest.jsp`中,我们需要一个变量来保存计数值,并在每次请求时更新这个值。可以使用...

    华为编程开发规范与案例

    在一次测试中,并没有记得做了什么操作,发现HONET系统的主机复位了,之后,系统又工作正常了。由于没有打开后台的跟踪窗口,当时查了半天没有眉目。过了半天,现象又出现了,而且这次是主机在反复复位,系统根本...

    PDO::setAttribute讲解

    如果启用,查询结果会被一次性加载到内存。 设置这些属性有助于优化数据库操作的性能、错误处理策略以及数据一致性。例如,如果你需要确保所有列名都是小写,可以使用PDO::setAttribute(PDO::ATTR_CASE, PDO::CASE_...

    云上铺会员管理系统 v4.18.zip

    拥有不同类型和功能的卡片,可设置计次卡、打折卡、储值卡、积分卡、月卡季卡;支持会员推荐、员工开卡提成、根据自定义属性记录不同的会员资料;可进行会员充次、充值等。 会员自助平台:会员可在线预约、预定、...

    正则表达式

    (ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复. 在正则表达式中,括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从...

    2014年Java最全面试题以及答案.

    HashMap和Hashtable都实现了Map接口,HashMap非线程安全,可以接受null键和多个null值;Hashtable线程安全,不允许null键和值。 46. Collection和Collections的区别。 Collection是一个集合框架的主要接口,包括...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    等待上一次数据发送完成时,在发送中断中提取FIFO发送队列中的下一帧数据并发出。 Communi.C的功能为与应用层相关度较高的函数,如发送应用层帧,记录错误。 CAN1_SWI_Handler (void) 实现CAN接收中断触发的内部...

    107个常用javascript语句

    97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置. 98.string.match(regExpression),判断字符是否匹配. 99.string.replace(regExpression,replaceString)替换现有字符串. 100.string.split(分隔...

    C语言面试大汇总

    - **初始化**:静态局部变量只初始化一次,而普通局部变量每次函数调用都会重新初始化。 #### 静态函数与普通函数的区别 - **作用域**:静态函数仅在其定义的文件内部可见,而普通函数在整个程序中可见。 - **声明...

    c# 加密和解密相关代码

    向散列函数得到一个固定长度的散列值,数据块的签名就是计算数据块的散 列值,MD5 算法的散列值为128 位。本实例演示如何使用MD5 算法对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在...

    SQL SERVER中SELECT和SET赋值相同点与不同点(推荐)

    2. **赋值数量**:`SET`语句一次只能对一个变量进行赋值,如: ```sql DECLARE @NAME NVARCHAR(128), @AGE INT; SET @NAME = N'小明'; SET @AGE = 18; ``` 而`SELECT`可以一次性给多个变量赋值,例如: ```...

    《数据结构 1800题》

    5. 下面关于算法说法错误的是(D )【南京理工大学 2000 一、1(1.5分)】 A.算法最终必须由计算机程序实现 B.为解决某问题的算法同为该问题编写的程序含义是相同的 C. 算法的可行性是指指令不能有二义性 D. ...

Global site tag (gtag.js) - Google Analytics