当前位置:  数据库>oracle

PL/SQL中错误的异常处理

    来源: 互联网  发布时间:2017-06-10

    本文导语: PL/SQL中对于错误的处理是很重要的一个部分,就跟写程序中对于异常的处理一样。可能程序中正常的流程实现部分不是很复杂,但是对于各种可能发生的异常情况都需要面面俱到的处理要占一半以上的代码量。 首先PL/SQL中的异...

PL/SQL中对于错误的处理是很重要的一个部分,就跟写程序中对于异常的处理一样。可能程序中正常的流程实现部分不是很复杂,但是对于各种可能发生的异常情况都需要面面俱到的处理要占一半以上的代码量。

首先PL/SQL中的异常处理需要重视,但是异常的处理绝大多数的人写PL/SQL的时候都不够重视,通常在数据处理完之后对于异常的处理都是以如下的形式结尾:

when others then
  dbms_output.put_line('error......');

如果你也是这样的习惯来用when others,就需要注意了。tom大师在自己的书《深入数据库体系结构》也做了详细的解释,下面标黄的这句话让人很有感触。

  • In my experience, error handling is done wrong more often than it is done right
  • You don’t want to catch all exceptions
  • You want to catch specific exceptions you are expecting (which means they aren’t exceptions)
  • You should ignore all others – or of you do catch them to clean up a resource, RE-RAISE them

Oracle的PL/SQL小组在新版本的改进中曾希望他提出3点建议,他的第一点建议就是去除when others,最后这个部分还是保留了,但是如果你的PL/SQL中when others没有后面没有raise 或者raise_application_error的部分,就会给出警告。

SQL> alter session set plsql_warnings='enable:all';
 Session altered.

SQL> create or replace procedure test_proc
  2  as
  3  begin
  4  dbms_output.put_line('this is a test');
  5  exception
  6  when others
  7  then
  8  dbms_output.put_line('error handling...');
  9  end;
  10  /

SP2-0804: Procedure created with compilation warnings

SQL> show errors
 Errors for PROCEDURE TEST_PROC:

LINE/COL ERROR
 -------- -----------------------------------------------------------------
 1/1      PLW-05018: unit TEST_PROC omitted optional AUTHID clause;
          default value DEFINER used

6/6      PLW-06009: procedure "TEST_PROC" OTHERS handler does not end in
        RAISE or RAISE_APPLICATION_ERROR


简单解释一下原因,就是因为在PL/SQL的执行中,打个比方,有两个Insert子句。
insert into t values(1);
 insert into t values(2);

在PL/SQL中是这样执行的
savepoint insert_point1;
 insert into t values(1);
 if error then rollback to insert_point1;
 savepoint insert_point2;
 insert into t values(2);
 if error then rollback to insert_point2;
这个步骤就相当于在一个事物中,每一个原子操作如果失败,都会在错误处理中进行rollback;
但是如果你在数据处理中,已经显式做了事物提交,那么你在错误处理的时候再rollback就晚了,前一部分已经提交了。
 这个情景就类似下面的场景
insert into t values(1);
 commit;
 insert into t values('xxxxx');  --这个语句会报错
 那么在整个事物的处理中第一部分已经提交了,第二部分出错了也没办法做回滚了。
 在when others 中加入了rollback也无济于事。

 可能大家在更多的错误处理中都是简单把错误信息打印出来而已,这样的处理结果相当于你重写了错误的处理方法,
 下面隐式的错误处理就被覆盖了,除非你定义了合理的错误处理场景,使用raise或者raise_application_error对错误做了正确的处理。
if error then rollback to insert_point1;
 if error then rollback to insert_point2;

所以在错误的处理中还是建议不要使用when others 子句。这种笼统的错误处理可能更多的时候会造成数据的不一致。
 如果一定想要使用when others then
可以采用类似下面的形式。
begin
 savepoint sp;
 process;--这个部分就是具体的处理代码
exception
 when others then
    rollback to sp;
    dbms_output.put_line('Error,||sqlerrm);
 end;
 /
这样即使代码中的某一部分出现异常,也能保证整个事物是一个原子操作。

SQLPLUS spool 到动态日志文件名

Oracle SQLPLUS提示符设置

通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度

PL/SQL Developer实用技巧分享


    
 
 

您可能感兴趣的文章:

  • SQL Server"错误 21002: [SQL-DMO]用户 * 已经存在问题解决
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql2005 create file遇到操作系统错误5拒绝访问 错误1802
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • 在jsp中做页面登录,出现错误信息“数据库执行错误:No suitable driver”,我怀疑是不是我不能用sql 7.0
  • Java的SQL语句执行错误问题
  • Microsoft SQL Server 2005 错误 29503 的解决方法
  • 清除SQL SERVER错误日志出现操作系统错误的解决方法
  • SQL Server 2005 还原数据库错误解决方法
  • sql="insert into fr0"+"values ('4','name');";怎么老有错误?
  • sql 约束性错误要注意的问题及其它
  • Sql语句的错误(在线给分)
  • SQL Server导入导出数据时最常见的一个错误解决方法
  • 在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • 请问 错误:java.sql.SQLException: Exhausted Resultset
  • 在SQL Server的try...catch语句中获取错误消息代码的的语句
  • sql server 2005 附加数据库出错(错误号:5123)的解决方法
  • 高分求助,出现SQL的错误,是怎么回事?
  • java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • SQL语句中含有乘号报错的处理办法
  • SQL处理包 LocalSQL
  • SqlServer中用exec处理sql字符串中含有变量的小例子
  • sqlserver中通过osql/ocmd批处理批量执行sql文件的方法
  • 初学者问题:标准的sql里有处理日期的函数吗?
  • jsp处理sql语句的问题,急!马上给分!
  • sql 约束性错误要注意的问题及其它 iis7站长之家
  • SQL Server2008数据库导入导出兼容性处理方案
  • 浅析SQL存储过程和事务处理
  • MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • PL/SQL Developer 10.0发布
  • Toby's PL/SQL Editor
  • Orcale 数据库客户端PL/SQL 中文乱码的问题解决方法
  • Oracle中在pl/sql developer修改表的2种方法
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • oracle中如何用PL/SQL打开一个指定的库,并在屏幕上列出库中的所有表?
  • 解析PL/SQL Developer导入导出数据库的方法以及说明
  • Oracle中PL/SQL中if语句的写法介绍
  • 64位win7下pl/sql无法连接oracle解决方法
  • PL/SQL编程经验小结开发者网络Oracle
  • http://www.ddtong.com/Sql.pl?nId=871609&csId=340387&cName=%bd%af%d3%ee%d6%c7,name如何转化成中文(直接java代码)
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法
  • Oracle PL/SQL入门案例实践
  • Oracle使用PL/SQL操作COM对象
  • Oracle中的存储过程在pl/sql和java中如何调用
  • Oracle数据库编写PL/SQL代码经验谈
  • PL/SQL Number数字类型函数
  • PL/SQL Dev连接Oracle弹出空白提示框的解决方法分享
  • ORACLE PL/SQL 触发器编程篇介绍
  • [Oracle新手教程] 用PL/SQL画直方图
  • Oracle PL/SQL入门慨述
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,