近期。在做开发、写存过的时候碰到一些问题,找了好长时间才发现原因。并且是曾经不知道的。

所以在这给记下来 给自己备忘和大家參考。

一 、null值

以下举个最简单的样例。寻常工作其中肯定比这个sql复杂的多,在这仅仅是把这个易错点呈现出来,他可能是一个复杂sql出错的小的 不easy被发现的一个问题。

上面是一个非常easy表的全部数据。area_num 区域编码 area_name 区域名称 delflag 有无效标识 1有效 0无效(当中淮北 和宣城的delflag为null)。

如今想找出有效的那些区域信息,所以用以下的语句:

上面的结果中没有淮北和宣城 跟预想中的不一样 一開始以为是 delflag不为0的全部应该都被查询出来 包含淮北和宣城。

其实 淮北和宣城 delflag的字段是 null值。在oracle里面null值得概念:

NULL是数据库中特有的数据类型,当一条记录的某个列为NULL,则表示这个列的值是未知的、是不确定的。

既然是未知的,就有无数种的可能性。因此。NULL并非一个确定的值。

所以null值(不确定的值) 并不符合 !='0' 这个 条件。相同以下语句也是这样。

二、无结果

无结果事实上就是一个select查询没有结果集(不是null,而是没有结果)

结果为null:

无结果:

表面看非常的清楚明确,可是到了实际应用中可能 会easy搞错。

以下是演示样例的存储过程:

create or replace function getProceessidAllDealBySkf_l(proceessid in number)return varchar2 ascursor pcursor is(select distinct t.orgid, t.oper_namefrom tssa_his_dsg.wh_common_busilog_td twhere t.processinstid = proceessid);--取操作日志表某个工单流程proceessid的操作人所属机构id。和操作名称orgidCursor   pcursor%rowtype;--定义类型为pcursor行数据的 变量orgid_var     varchar2(20);--存放操作人机构id变量returnflag    varchar2(20);--返回的标志位orgseqflag    varchar2(50);--操作人机构id及其全部父id 串起来字符skforgflag    varchar2(20);--存放操作人机构id变量count_var     number;--存放统计数字变量oper_name_var varchar2(100);--操作名称
beginreturnflag    := '1';--返回值初始化为1orgseqflag    := null;--初始化skforgflag    := null;--初始化count_var     := 0;--初始化oper_name_var := null;--初始化open pcursor;--打开游标loopfetch pcursorinto orgidCursor;--把游标数据放进pcursor变量exit when pcursor%notfound;orgid_var     := orgidCursor.orgid;--从orgidCursor变量取值到orgid_varoper_name_var := orgidCursor.oper_name;--从orgidCursor变量取值到oper_name_varif (orgid_var is null) then--orgid_var是可能为空的 表里面t.orgid为空 null;elseselect count(1)into count_varfrom tssa_dsg.eosorg_t_organization b,(select a.*from tssa_dsg.bndict_t_dictionary awhere a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'and a.status = '0') awhere b.orgproperty = a.businid(+)and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里if (count_var > 0) then--在里面select t.orgseqinto orgseqflagfrom tssa_dsg.eosorg_t_organization twhere t.orgid = orgid_var--取orgseqflag;select a.businnameinto skforgflagfrom tssa_dsg.eosorg_t_organization b,(select a.*from tssa_dsg.bndict_t_dictionary awhere a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'and a.status = '0') awhere b.orgproperty = a.businid(+)and b.orgid = orgid_var;--取组织分类if (orgseqflag like '99999.7676.%' or skforgflag = '省客服' or(skforgflag != '省客支' and skforgflag != '省层面' andoper_name_var = '话务员追加信息')) thennull;elsereturnflag := null;--不满足id条件 置返回值为nullend if;end if;end if;end loop;close pcursor;return returnflag;
end;

上面这个过程的作用就是根工单流程id 返回该工单是否仅仅经过某个特定组织机构的人处理的标志。

操作日志表的orgid有为空的情况。
if(orgid_var is null) 这个条件 推断假设为空 视该记录无效,不參与推断(业务要求)。

假设不加这个条件 (且没有

select count(1)into count_varfrom tssa_dsg.eosorg_t_organization b,(select a.*from tssa_dsg.bndict_t_dictionary awhere a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'and a.status = '0') awhere b.orgproperty = a.businid(+)and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里

以下这个语句

select t.orgseqinto orgseqflagfrom tssa_dsg.eosorg_t_organization twhere t.orgid = orgid_var

查出来是没有结果的 就是无值

 into orgseqflag

就会报错(调试会报错,直接执行不报错) 直接 跳出 loop 给 return 一个null 值 是不符合业务要求的。

select count(1)into count_varfrom tssa_dsg.eosorg_t_organization b,(select a.*from tssa_dsg.bndict_t_dictionary awhere a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'and a.status = '0') awhere b.orgproperty = a.businid(+)and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里
if (count_var > 0) then--在里面

上面这个条件作用跟if(orgid_var is null)是一样的 是忽略 操作日志表的机构id不在机构静态表里的情况。

转载于:https://www.cnblogs.com/gcczhongduan/p/5093801.html

oracle 让人抓狂的错误之 null值 与 无值(无结果)-开发系列(一)相关推荐

  1. 如何重置计算机服务到默认状态,电脑慢到让人抓狂?教你如何将Windows10还原到出厂设置...

    原标题:电脑慢到让人抓狂?教你如何将Windows10还原到出厂设置 来源:腾讯数码 关于Windows系统,我们都知道,很少有Windows电脑会比出厂时更快,更容易使用,因为随着时间的累积,电脑里 ...

  2. tt语音服务器老是炸,TT语音:巨真实的开黑情况,奇葩开黑队友,每一种都让人抓狂...

    原标题:TT语音:巨真实的开黑情况,奇葩开黑队友,每一种都让人抓狂 现在大火的游戏基本上都是竞技类游戏,需要多人联手配合赢得胜利.因此,玩家之间相互开黑就成了常态,和路人一起开黑更是经常的事情.尤其是 ...

  3. 盘点那些年让人抓狂的计算机术语翻译

    文章首发于公众号「蝉沐风」,欢迎关注 不知道大家刚开始学习计算机的时候有没有被某些概念折磨的经历,可能会有很长一段时间无法理解某一个概念.有没有这么一种可能,不是我们的水平问题,而是这些概念本身翻译地 ...

  4. Spring Boot - 让人抓狂的ClassNotFoundException

    我们的项目基于Spring Boot + Maven,采用Intelli IDEA工具进行开发.代码在另一名同事的机器上检出之后,启动项目时,始终出现如下错误提示: 03-11 15:41:23[or ...

  5. 20个让人抓狂的脑筋急转弯

    1. 一个人的钱包掉了,他首先应怎么办?(答案:捡起来)       但他没捡,为什么?(答案:因为他是比尔·盖茨) 2. 一只公鸡抓着刚下蛋的母鸡痛打,为什么?(答案:因为那只母鸡下了一个鸭蛋) 3 ...

  6. 这些让人抓狂的烂代码,你碰到几种?

    刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情. 当时的我在听到这种观点时会有 ...

  7. 用这个工具,让人抓狂的领导驾驶舱报表五步搞定

    今天讲个实操课,如何快速制作领导驾驶舱! 既然是快速制作,那就不多说废话了,我们看看是怎么样5个步骤就可以快速做出漂亮的领导驾驶舱! 第一步:理清需求,设计草图. 纵然再华丽的外表也需要有内在做基础. ...

  8. 程序员设计的这些作品震惊UI界!真让人抓狂!直接笑还是走程序?

    大家有没有想过,如果程序员gg们来做设计,这个世界会变成什么样子? 如果哪天设计师消失了,这个世界会变成什么样? 经常逛淘宝的朋友会发现,在淘宝或者其他电商网站,有一个"设计"流派 ...

  9. 【BZOJ1082】【codevs2456】栅栏,让人抓狂的优化剪枝

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1341 Solved: 583 [Submit][Status] ...

最新文章

  1. typedef的作用
  2. 什么是死锁?死锁产生的四个必要条件?如何避免与预防死锁?
  3. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法
  4. 2021中超1 1006 xor sum
  5. 利用ffmpeg来进行视频解码的完整示例代码
  6. WPF在预览视图下可以看到图片,运行时却报错提示找不到资源
  7. 公共计算机课程思政建设实施方案,公共计算机教研组开设课程思政公开课
  8. RAID0、1、5、6、10介绍
  9. Java网络通信 TCP网络,ServerSocket类
  10. 异步时钟下跨时钟域信号处理
  11. 自学网html视频教程,ps教程自学网html视频教程
  12. 常用软件静默安装参数
  13. [c#]删除PDF权限密码
  14. 台式计算机显卡最高温度多少,笔记本/台式机显卡核心多少度正常?GPU温度过高该如何处理?...
  15. Python3,csvkit功能竟如此强大,不仅可以转换csv格式文件,还能进行数据处理和分析。
  16. POSCMS 后台友情链接增加所属栏目分类功能
  17. MySQL数据库(四)底层NB-IoT数据流的数据库写入
  18. 最好的前端开发资源推荐
  19. 格式化选择NTFS 还是FAT32?
  20. RPi.GPIO 官方使用文档翻译

热门文章

  1. python人工智能-Python 人工智能应用快速入门 (一)
  2. python php区别-JAVA、PHP、Python这3种编程语言有什么区别?
  3. python创建一个txt文件-python中如何创建一个txt文件
  4. python 基础命令-python常用命令有哪些
  5. python怎么读取文件-python怎么读写文件操作
  6. python项目-2019年5月GitHub上热门的Python项目
  7. 为何python不好找工作k-为何有人说Python不好找工作?
  8. python培训班学费-南京Python培训班学费贵吗怎么收费
  9. python解释器是什么-python的解释器是什么?
  10. 函数式编程语言python-函数式编程初探