找回密码
 注册会员
查看: 707|回复: 0

关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常

[复制链接]
发表于 2010-6-21 10:24:36 | 显示全部楼层 |阅读模式
<p>关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常</p>
<p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:30 -</p>
<p>解决时间:2010-6-21 10:20</p>
<p>当在PL_SQL中执行SELECT … INTO …语句时,如果返回结果集为空,则回触发NO_DATA_FOUND错误。但是当 SELECT 中有字段用到函数时,即使结果集为空,也不会触发NO_DATA_FOUND错误。</p>
<p>CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS</p>
<p>test    date;</p>
<p>BEGIN</p>
<p>SELECT END_TIME</p>
<p>INTO test</p>
<p>FROM RD.R_LINE_STOP_TIME</p>
<p>WHERE rownum = 1;</p>
<p>END EXCEPTION_TEST;</p>
<p>当执行该存储过程时,会提示错误</p>
<p>ORA-01403: no data found</p>
<p>ORA-06512: at "RD.EXCEPTION_TEST", line 17</p>
<p>ORA-06512: at line 1</p>
<p>CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS</p>
<p>test    date;</p>
<p>BEGIN</p>
<p>SELECT max(END_TIME)</p>
<p>INTO test</p>
<p>FROM RD.R_LINE_STOP_TIME</p>
<p>WHERE rownum = 1;</p>
<p>END EXCEPTION_TEST;</p>
<p>当执行带有函数的存储过程时,则并不会报no data found异常.</p>
<p>CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS</p>
<p>test    varchar2(10);</p>
<p>BEGIN</p>
<p>SELECT to_char(END_TIME, \'yyyy-mm-dd\')</p>
<p>INTO test</p>
<p>FROM RD.R_LINE_STOP_TIME</p>
<p>WHERE rownum = 1;</p>
<p>END EXCEPTION_TEST;</p>
<p>但是在执行带to_char、substr等这样的函数会报no data found异常。</p>
<p>是否程序只在执行<b>集合函数</b>时,会屏蔽掉NO_DATA_FOUND错误?</p>
<p>问题补充:</p>
<p>我是想知道关于NO_DATA_FOUND这个EXCEPTION为什么会在SELECT  的字段有加max、SUM等函数时,不会出现?</p>
<p>提问者: wsong1103 - 二级</p>
<p>最佳答案</p>
<p>这里就涉及到</p>
<p>有一条记录但是记录是空记录</p>
<p>和没有一条记录</p>
<p>的问题了。</p>
<p>首先弄清楚no data found异常是在找不到一条记录的时候报的异常,但是在找到一条空记录的时候是不会报这个异常的。</p>
<p>用集合函数之所以不会报错原因是:</p>
<p>用集合函数的时候,当参数没有赋值时,函数会默认赋一个空值来进行计算,返回的结果也是一个空值(不是没有值)。</p>
<p>而to_char、substr这些函数就不会当参数没有赋值时默认赋空值,也就没有结果返回。</p>
<p>所以区别就是一个有记录返回,但是个空记录,而一个是没有记录返回。</p>
<p>其实你要看清楚空记录和没有记录的区别可以执行如下的程序看返回结果的差别就懂了。</p>
<p>OPEN OUTCURSOR FOR</p>
<p>select  MAX(t.Time) from dept t where t.id>\'10\';</p>
<p>比较</p>
<p>OPEN OUTCURSOR FOR</p>
<p>select  t.Time from dept t where t.id>\'10\';</p>
<p>再比较</p>
<p>OPEN OUTCURSOR FOR</p>
<p>select  to_char(t.Time,\'yyyy-mm-dd\') from dept t where t.id>\'10\';</p>
<p>1</p>
<p>回答者:</p>
<p>吴虞子 - 四级   2010-6-17 17:24</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>非常感谢!我试了下,确实如你所言。</p>
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|文字版|手机版|小黑屋|襄阳城

GMT+8, 2025-5-18 01:07

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表