关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常
当在PL_SQL中执行SELECT … INTO …语句时,如果返回结果集为空,则回触发NO_DATA_FOUND错误。但是当 SELECT 中有字段用到函数时,即使结果集为空,也不会触发NO_DATA_FOUND错误。 CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS test date; BEGIN SELECT END_TIME INTO test FROM RD.R_LINE_STOP_TIME WHERE rownum = 1; END EXCEPTION_TEST; 当执行该存储过程时,会提示错误 ORA-01403: no data found ORA-06512: at "RD.EXCEPTION_TEST", line 17 ORA-06512: at line 1 CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS test date; BEGIN SELECT max(END_TIME) INTO test FROM RD.R_LINE_STOP_TIME WHERE rownum = 1; END EXCEPTION_TEST; 当执行带有函数的存储过程时,则并不会报no data found异常. CREATE OR REPLACE PROCEDURE RD.EXCEPTION_TEST IS test varchar2(10); BEGIN SELECT to_char(END_TIME, 'yyyy-mm-dd') INTO test FROM RD.R_LINE_STOP_TIME WHERE rownum = 1; END EXCEPTION_TEST; 但是在执行带to_char、substr等这样的函数会报no data found异常。 是否程序只在执行集合函数时,会屏蔽掉NO_DATA_FOUND错误? 我是想知道关于NO_DATA_FOUND这个EXCEPTION为什么会在SELECT 的字段有加max、SUM等函数时,不会出现?
最满意答案
这里就涉及到 有一条记录但是记录是空记录 和没有一条记录 的问题了。 首先弄清楚no data found异常是在找不到一条记录的时候报的异常,但是在找到一条空记录的时候是不会报这个异常的。 用集合函数之所以不会报错原因是: 用集合函数的时候,当参数没有赋值时,函数会默认赋一个空值来进行计算,返回的结果也是一个空值(不是没有值)。 而to_char、substr这些函数就不会当参数没有赋值时默认赋空值,也就没有结果返回。 所以区别就是一个有记录返回,但是个空记录,而一个是没有记录返回。 其实你要看清楚空记录和没有记录的区别可以执行如下的程序看返回结果的差别就懂了。 OPEN OUTCURSOR FOR select MAX(t.Time) from dept t where t.id>'10'; 比较 OPEN OUTCURSOR FOR select t.Time from dept t where t.id>'10'; 再比较 OPEN OUTCURSOR FOR select to_char(t.Time,'yyyy-mm-dd') from dept t where t.id>'10';更多推荐
发布评论