ORACLE 不用写NO_DATA_FUND 异常捕获,开发的一个小技巧!
2014-09-30 15:24
246 查看
这是我在工作中发现的一个很实用的小技巧,可以少写一些代码.下面,以scott.emp表为例子
先写一个过程:
create or replace procedure p_get_sal(p_empno int) is
v_sal number;
begin
select a.sal into v_sal from scott.emp a where a.empno = p_empno;
dbms_output.put_line(v_sal);
end;
再调用:
SQL> set serveroutput on
SQL> exec p_get_sal(123456);
begin p_get_sal(123456); end;
ORA-01403: 未找到任何数据
ORA-06512: 在 "SCOTT.P_GET_SAL", line 4
ORA-06512: 在 line 2
如果改写一下:
create or replace procedure p_get_sal(p_empno int) is
v_sal number;
begin
select max(a.sal) into v_sal from scott.emp a where a.empno = p_empno;
dbms_output.put_line(v_sal);
end;
SQL> exec p_get_sal(123456);
PL/SQL procedure successfully completed
则能正确执行.
也就是说,用MAX SUM 等聚合函数,即使在没有找到行的情况下,也会返回一个NULL 行,有了这个NULL行,就不用写NO_DATA_FUND了.在很多时候,需要先去查询一个表,再根据查出来的值做判断,这个时候这样写就很有用,避免了写异常捕获,代码更简洁.
另外,自定义函数找不到值也不会报错:
create or replace function f_get_sal(p_empno int) return number is
v_sal number;
begin
select a.sal into v_sal from scott.emp a where a.empno = p_empno;
return v_sal;
end;
SQL> select f_get_sal(123456) from dual;
F_GET_SAL(123456)
-----------------
先写一个过程:
create or replace procedure p_get_sal(p_empno int) is
v_sal number;
begin
select a.sal into v_sal from scott.emp a where a.empno = p_empno;
dbms_output.put_line(v_sal);
end;
再调用:
SQL> set serveroutput on
SQL> exec p_get_sal(123456);
begin p_get_sal(123456); end;
ORA-01403: 未找到任何数据
ORA-06512: 在 "SCOTT.P_GET_SAL", line 4
ORA-06512: 在 line 2
如果改写一下:
create or replace procedure p_get_sal(p_empno int) is
v_sal number;
begin
select max(a.sal) into v_sal from scott.emp a where a.empno = p_empno;
dbms_output.put_line(v_sal);
end;
SQL> exec p_get_sal(123456);
PL/SQL procedure successfully completed
则能正确执行.
也就是说,用MAX SUM 等聚合函数,即使在没有找到行的情况下,也会返回一个NULL 行,有了这个NULL行,就不用写NO_DATA_FUND了.在很多时候,需要先去查询一个表,再根据查出来的值做判断,这个时候这样写就很有用,避免了写异常捕获,代码更简洁.
另外,自定义函数找不到值也不会报错:
create or replace function f_get_sal(p_empno int) return number is
v_sal number;
begin
select a.sal into v_sal from scott.emp a where a.empno = p_empno;
return v_sal;
end;
SQL> select f_get_sal(123456) from dual;
F_GET_SAL(123456)
-----------------
相关文章推荐
- 【原创】Oracle函数中对于NO_DATA_FOUND异常处理的研究
- oracle开发学习篇之集合运算符以及集合异常捕获
- oracle 中的 no_data_found异常 含义
- oracle异常之no_data_found
- oracle开发学习篇之集合运算符以及集合异常捕获
- 数据库连接时一个异常的处理:java.sql.SQLException: No suitable driver found for
- 如何通过dll文件生成对应的lib文件(开发人员的一个小技巧)
- oracle开发的小技巧(原创)
- 【原创】select count(*) into 也会报 NO_DATA_FOUND 异常?!
- 收藏一个关于ORACLE自动启动的小技巧
- System.Data.OleDb.OleDbException: 发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。
- Oracle中删除数据的一个小技巧
- .NET 异常捕获机制的小技巧应用(实例:端口扫描程序)
- Oracle 10g 异常:ORA-01950: no privileges on Tablespace
- 一个不用安装客户端连Oracle的SQLPLUS
- XP不用登录密码进入系统的一个小技巧
- 如何通过dll文件生成对应的lib文件(开发人员的一个小技巧)
- ODBC的Oracle驱动的关于no_data_found的BUG
- .net 程序发生了一个不可捕获的异常
- oracle 笔记3 捕获异常