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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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异常。
是否程序只在执行<b>集合函数</b>时,会屏蔽掉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';
参考技术A 因为你用max的时候,如果没有数据的话,会给个defult值 null,你可以试一下。就是说返回了一条数据,只不过返回的数据是个null。

但是如果你没有用函数的话,它是没有返回值的,就是说连个null也没有,这就叫data not found。一条数据都没有。
参考技术B 你用max对空值进行处理并不会报错,因此即使返回空值也不会有异常 参考技术C 循环读取数据,test给个初始值吧

以上是关于关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中SQL 语句开发语法 SELECT INTO含义

关于oracle存储过程select into 未找到数据问题

关于oracle存储过程select into 未找到数据问题

Oracle中insert into select和select into的区别

oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

oracle存储过程select语句必须带into吗