PL_SQL中执行SELECT … INTO …语句时,如果返回结果集为空
2016-03-10 12:19
393 查看
当在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异常。
==========
我的理解是,当表中存在记录但字段值为空值,与表中不存在记录为空是两个不同的概念。一些集合函数如max,sum在处理的时候会自动引入null值。
不知sql server中是否也存在类似的问题?
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异常。
==========
我的理解是,当表中存在记录但字段值为空值,与表中不存在记录为空是两个不同的概念。一些集合函数如max,sum在处理的时候会自动引入null值。
不知sql server中是否也存在类似的问题?
相关文章推荐
- 免安装Oracle客户端使用PL/SQL
- 从关系型数据库到非关系型数据库
- [置顶] 数据库里表注释全????问题
- sqlite3 sqlite3_prepare、sqlite3_step使用
- mac 下面使用mysql(1)-安装mysql
- SQLServer: 用 PARSENAME 实现字符串截取(<=4个)
- MySQL 四种事务隔离级的说明
- Mysql常出现的问题
- zabbix使用自带模板监控mysql
- mysql主从切换(正常切换)
- 修改Oracle权限的SQL及常见错误
- oracle 查看隐藏参数
- MySQL存储过程建表
- SQLServer触发器的使用
- sql的临时表使用小结
- SQLServer实现split分割字符串到列
- Sql日期时间格式转换
- EXEC与sp_executesql的区别及应用
- Spark-SQL与hive整合【版本spark1.6.0+hive0.14】--Standalone模式
- Oracle SQL性能优化