关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常
当在PL_SQL中执行SELECT…INTO…语句时,如果返回结果集为空,则回触发NO_DATA_FOUND错误。但是当SELECT中有字段用到函数时,即使结果集为空,也...
当在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等函数时,不会出现? 展开
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等函数时,不会出现? 展开
4个回答
展开全部
这里就涉及到
有一条记录但是记录是空记录
和没有一条记录
的问题了。
首先弄清楚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';
有一条记录但是记录是空记录
和没有一条记录
的问题了。
首先弄清楚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';
展开全部
因为你用max的时候,如果没有数据的话,会给个defult值 null,你可以试一下。就是说返回了一条数据,只不过返回的数据是个null。
但是如果你没有用函数的话,它是没有返回值的,就是说连个null也没有,这就叫data not found。一条数据都没有。
但是如果你没有用函数的话,它是没有返回值的,就是说连个null也没有,这就叫data not found。一条数据都没有。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你用max对空值进行处理并不会报错,因此即使返回空值也不会有异常
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
循环读取数据,test给个初始值吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询