注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Memory extender

Beautiful Day..

 
 
 

日志

 
 

select into..sum..group by..空记录  

2010-03-25 10:47:15|  分类: SQL&PL/SQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

之前也见到过这种写法,只是没有记录下来,昨天看一段程序的时候又看到了这种写法,看到了问题。

举例说明简单一些。

declare

v_out   number;

begin

  select deptno into v_out from emp where empno = 0;

  dbms_output.put_line(v_out);

 end;

其中,empno为emp表中的主键,我们是想show出empno为0的记录的deptno,如果emp中不存在empno为0的记录,这段程序会报no_data_found,我们通常会用exception when no_data_found处理。

这里的处理方式是将deptno改成sum(deptno),当然前提是deptno必须为number型,而且这样的话,空值或空记录都一样会显示空,没有区分。

循序渐进地一个例子:

【1】

select sal from emp

where deptno=1

执行..

没有记录..

如果是下面这样:

【2】

declare

  v_out number := 0;

begin

  select sal into v_out from emp where empno = 1;

  dbms_output.put_line(v_out);

end;

执行..

Error

ora-01403:no data found

ora-06512:at line 4

当然可以用exception来处理,但是这里讲的不是这个问题,我们用别的方式来处理

【3】

declare

 v_out number := 0;

begin

 select sum(sal) into v_out from emp where empno = 1;

 dbms_output.put_line(v_out);

end;

这样就可以了,如果想让空值和空记录的时候显示成别的东东,还可以用nvl(sum(sal),'...')。

而如果需求是要计算某个deptno的所有员工的sal的总和,并且要求总和大于5000才show出来:

【4】

select sum(sal) from emp

 where deptno=5

 group by deptno

 having sum(sal)>5000

执行..

没有记录..

同样,如果是下面这样:

【5】

declare

 v_out number := 0;

begin

 select sum(sal)

  into v_out

   from emp

 where deptno = 40

group by deptno

 having sum(sal) > 5000;

dbms_output.put_line(v_out);

end;

执行..

同样:

Error

ora-01403:no data found

ora-06512:at line 4

修改:

【6】

declare

  v_out number := 0;

begin

 select sum(sum(sal))

  into v_out

  from emp

   where deptno = 5

group by deptno

    having sum(sal) > 5000;

dbms_output.put_line(v_out);

end;

执行..

正常。

可以看作是里面的sum(sal)和group by ...having...是一起作用的,先而外面的sum()是将他们的结果做汇总。

昨天看的那段程序就像【5】一样,他还有nvl(..,0),也就是想把空显示为0,因为空记录时并不会像他想象的那样正常过下去,最后显示为0,所以我猜想可能是因为当时或后来测试时报错,因此他们用exception when no_data_found处理,里面写了一个null,因此程序最后跑出来的结果是空的时候显示的就是空。事实看来应该是在nvl里面sum外面再加一个sum,如【6】所示。

 

  评论这张
 
阅读(1604)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018