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

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

一 、null值

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2hhaTc5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2hhaTc5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

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

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

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

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

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

二、无结果

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

结果为null:

无结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2hhaTc5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

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

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

create or replace function getProceessidAllDealBySkf_l(proceessid in number)
return varchar2 as
cursor pcursor is(
select distinct t.orgid, t.oper_name
from tssa_his_dsg.wh_common_busilog_td t
where 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);--操作名称
begin
returnflag := '1';--返回值初始化为1
orgseqflag := null;--初始化
skforgflag := null;--初始化
count_var := 0;--初始化
oper_name_var := null;--初始化
open pcursor;--打开游标 loop
fetch pcursor
into orgidCursor;--把游标数据放进pcursor变量
exit when pcursor%notfound; orgid_var := orgidCursor.orgid;--从orgidCursor变量取值到orgid_var
oper_name_var := orgidCursor.oper_name;--从orgidCursor变量取值到oper_name_var if (orgid_var is null) then--orgid_var是可能为空的 表里面t.orgid为空
null;
else
select count(1)
into count_var
from tssa_dsg.eosorg_t_organization b,
(select a.*
from tssa_dsg.bndict_t_dictionary a
where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
and a.status = '0') a
where b.orgproperty = a.businid(+)
and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里
if (count_var > 0) then--在里面
select t.orgseq
into orgseqflag
from tssa_dsg.eosorg_t_organization t
where t.orgid = orgid_var
--取orgseqflag
;
select a.businname
into skforgflag
from tssa_dsg.eosorg_t_organization b,
(select a.*
from tssa_dsg.bndict_t_dictionary a
where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
and a.status = '0') a
where b.orgproperty = a.businid(+)
and b.orgid = orgid_var;--取组织分类 if (orgseqflag like '99999.7676.%' or skforgflag = '省客服' or
(skforgflag != '省客支' and skforgflag != '省层面' and
oper_name_var = '话务员追加信息')) then
null;
else
returnflag := null;--不满足id条件 置返回值为null
end if;
end if;
end if;
end loop;
close pcursor;
return returnflag;
end;

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

操作日志表的orgid有为空的情况。

if(orgid_var is null) 这个条件 推断假设为空 视该记录无效,不參与推断(业务要求)。

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

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

以下这个语句

select t.orgseq
into orgseqflag
from tssa_dsg.eosorg_t_organization t
where t.orgid = orgid_var

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

 into orgseqflag

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

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

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






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

  1. 使用Google产品以来遇到的最糟糕、最霸道、最让人抓狂的设计

    很久没有登录cnblogs@gmail.com这个邮箱,今天通过gmail.com登录了一下,登录后出现一个对话框要求设置性别与出生日期,而且必须要设置,不设置不让登录. 这个邮箱是我们网站用的是邮箱 ...

  2. C++雾中风景15:聊聊让人抓狂的Name Mangling

    Name Mangling,直接翻译过来为名字改写 .它是深入理解 C++ 编译链接模型的必由之路. 笔者近期进行数据库开发工作时,涉及到MySQL客户端的编译链接的问题,通过重新厘清了之前理解一知半 ...

  3. 让人抓狂的MySQL安装-8.0.12版本

    今天一个下午就做了一件事,把MySQL安装成功,安装的过程让人很狂躁.于是一边骂,一边查错,才把这个软件给安装成功了. 详细的安装步骤,这里就不赘述了.参见https://blog.csdn.net/ ...

  4. 轻松搞定word中让人抓狂的自动编号

    在word中使用自动编号时,如果一级编号是2,想让其后面的二级编号自动编号为2.1.2.2--,三级编号自动编号为2.1.1.2.1.2--:且在该一级编号调整为3时,后面的二级编号和三级编号的第一位 ...

  5. 关于oracle下提示ORA-00904:Invalid identifier错误的问题

    转自:https://blog.csdn.net/suleil1/article/details/49471549 今天在建表后对数据进行插入,遇到这个恶心人的ORA-00904:Invalid id ...

  6. 登陆Oracle,报oracle initializationg or shutdown in progress 错误提示

    前两天,登陆Oracle,发现登陆不上去了,报”oracle initializationg or shutdown in progress 错误提示” 错误. 然后就想着怎么去解决,首先自己到win ...

  7. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法

    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法 登陆数据库时提示 “ORA-01033”错误在命令窗口以s ...

  8. 那年曾让我哭笑不得抓狂的C语言

    1.关于+=以及-= 这是两个运算符,但你否有过这种经历: int temp; char i ;i<MAX;i++) { ... temp=+; //这里本意是每次循环,temp都自增2,但是却 ...

  9. Oracle问题之ORA-12560TNS:协议适配器错误

    Oracle问题之ORA-12560TNS:协议适配器错误 一.造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始-- ...

随机推荐

  1. XMPP开发之从零開始

    对于server的搭建和设置.我在这里就不再多说了.有好多前辈已经帮大家攻克了.能够參考下这篇博客 XMPPserver配置 我依照这个博客配置好了,server后,然后在网上參照代码写了一个小的de ...

  2. softInputMode- 软件盘监听事件

    软件盘的监听事件,如下 private final OnKeyListener mSubjectKeyListener = new OnKeyListener() { @Override public ...

  3. java 三次样条插值 画光滑曲线 例子

    java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图  不光滑和光滑曲线前后对比:    代码: 执行类: p ...

  4. DG查看恢复进度

    查看恢复进度 (1)查看进程的活动状态 V$MANAGED_STANDBY视图专用于显示物理Standby数据库相关进程的当前状态,该视图中的列也很有特点,查看进程状态时,通常我们会关注PROCESS ...

  5. BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  6. CISP/CISA 每日一题 13

    监控信息系统人员所提供服务的效率和效果的工具: 1.例外报告:识别所有没有成功完成的或出了故障的应用 2.作业重运行报告:大多数异常终止作业都会导致重起 3.操作员问题报告:记录计算机运行问题及解决方 ...

  7. mysql新加入用户与删除用户详细操作命令

    方法1 :使用mysql root(root权限)用户登陆直接赋权也能够创建用户 /usr/bin/mysqladmin -u root password 123456 mysql -uroot -p ...

  8. @property 和@synthesize

    xcode4.4之后,@property包括了@synthesize的功能. 这是编译器的升级. @property有几个作用:1)默认生成一个私有成员变量,并有一个带下划线的别名如_age   2) ...

  9. php数组函数(分类基本数组函数,栈函数,队列)

    php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...

  10. Spark应用程序部署工具Spark Submit

    不多说,直接上干货!  spark-submit在哪个位置 [spark@master ~]$ cd $SPARK_HOME/bin [spark@master bin]$ pwd /usr/loca ...