PL/SQL 异常错误处理

企鹅博客
企鹅博客
企鹅博客
29814
文章
0
评论
2020年9月15日02:23:12 评论 31 views 2804字阅读9分20秒

一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。Oracle 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理

--------------------------------------分割线 --------------------------------------

rlwrap - 解决Linux下SQLPLUS退格、上翻键乱码问题 http://www.linuxidc.com/Linux/2013-07/87890.htm

SQLPLUS spool 到动态日志文件名 http://www.linuxidc.com/Linux/2013-03/80988.htm

Oracle SQLPLUS提示符设置 http://www.linuxidc.com/Linux/2012-10/73326.htm

通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度 http://www.linuxidc.com/Linux/2011-07/38711.htm

PL/SQL Developer实用技巧分享 http://www.linuxidc.com/Linux/2014-09/107391.htm

--------------------------------------分割线 --------------------------------------

①有三种类型的异常错误:
1. 预定义( Predefined )错误
    ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

2. 非预定义( Predefined )错误
    即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

3. 用户定义(User_define) 错误
    程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

②异常处理部分一般放在PL/SQL 程序体的后半部,结构为:
    EXCEPTION
        WHEN first_exception THEN<code to handle first exception >
        WHEN second_exception THEN<code to handle second exception >
        WHEN OTHERS THEN <code to handle others exception >
    END;
异常处理可以按任意次序排列,但OTHERS 必须放在最后.

③预定义的异常处理
对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。

[预定义异常]
declare

  v_sal employees.salary%type;
begin
  select salary into v_sal
  from employees
  where employee_id >100;
 
  dbms_output.put_line(v_sal);

exception
  when Too_many_rows then dbms_output.put_line('输出的行数太多了');
end;

④非预定义的异常处理
对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义。步骤如下:
1. 在PL/SQL 块的定义部分定义异常情况:
<异常情况>  EXCEPTION;

2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT 语句:
PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

[非预定义异常]
declare

  v_sal employees.salary%type;
  --声明一个异常
  delete_mgr_excep exception;
  --把自定义的异常和oracle的错误关联起来
  PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
begin
  delete from employees
  where employee_id = 100;
 
  select salary into v_sal
  from employees
  where employee_id >100;
 
  dbms_output.put_line(v_sal);

exception
  when Too_many_rows then dbms_output.put_line('输出的行数太多了');
  when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
end;

⑤用户自定义的异常处理
当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用RAISE语句来触发。当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常情况的处理,步骤如下:
1. 在PL/SQL 块的定义部分定义异常情况:

<异常情况>  EXCEPTION;
2. RAISE <异常情况>;

3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

[用户自定义异常]
declare

  v_sal employees.salary%type;
  --声明一个异常
  delete_mgr_excep exception;
  --把自定义的异常和oracle的错误关联起来
  PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
 
  --声明一个异常
  too_high_sal exception;
begin

  select salary into v_sal
  from employees
  where employee_id =100;
 
  if v_sal > 1000 then
    raise too_high_sal;
  end if;
   
  delete from employees
  where employee_id = 100;

  dbms_output.put_line(v_sal);

exception
  when Too_many_rows then dbms_output.put_line('输出的行数太多了');
  when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
  --处理异常
  when too_high_sal then dbms_output.put_line('工资过高了');
end;

⑥在PL/SQL 中使用SQLCODE, SQLERRM

SQLCODE 返回错误代码数字
SQLERRM 返回错误信息.

继续阅读
weinxin
欢迎加入中国站长博客之家
本站的所有资源都会上传分享到博客之家,希望大家互相学习交流进步。
如何配置 MongoDB 副本集 Linux-数据库

如何配置 MongoDB 副本集

MongoDB 已经成为市面上最知名的 NoSQL 数据库。MongoDB 是面向文档的,它的无模式设计使得它在各种各样的WEB 应用当中广受欢迎。最让我喜欢的特性之一是它的副本集(Replica S...
CentOS下Redis 2.6.14安装配置 Linux-数据库

CentOS下Redis 2.6.14安装配置

Redis 是一个开源、支持网络、基于内存、键值对存储数据库,使用 ANSI C 编写。其开发由 VMware 主持。根据月度排行网站 DB-Engines.com 的数据显示,Redis 是最流行的...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: