异常处理程序

一个好的程序应该能够妥善处理各种错误情况,并尽可能从错误中恢复。ORACLE 提供异常(EXCEPTION)和异常处理(EXCEPTION HANDLER)错误处理

①有三种类型的异常错误:

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 返回错误信息.

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);

⑦异常程序:

1.通过 select ... into ... 查询某人的工资, 若没有查询到, 则输出 "未找到数据"

declare

  --定义一个变量

  v_sal employees.salary%type;

begin

  --使用 select ... into ... 为 v_sal 赋值

  select salary into v_sal from employees where employee_id = 1000;

  dbms_output.put_line('salary: ' || v_sal);

exception

  when No_data_found then

       dbms_output.put_line('未找到数据');

end;



declare

  --定义一个变量

  v_sal employees.salary%type;

begin

  --使用 select ... into ... 为 v_sal 赋值

  select salary into v_sal from employees;

  dbms_output.put_line('salary: ' || v_sal);

exception

  when No_data_found then

       dbms_output.put_line('未找到数据!');

  when Too_many_rows then

       dbms_output.put_line('数据过多!');    

end;

2. 更新指定员工工资,如工资小于300。则加100;对 NO_DATA_FOUND 异常, TOO_MANY_ROWS 进行处理.

declare

   v_sal employees.salary%type;

begin

   select salary into v_sal from employees where employee_id = 100;

  

   if(v_sal < 300) then

       update employees set salary = salary + 100 where employee_id = 100;

   else

       dbms_output.put_line('工资大于300');

   end if;

exception

   when no_data_found then

       dbms_output.put_line('未找到数据');

   when too_many_rows then

       dbms_output.put_line('输出的数据行太多');

end;

3. 处理非提前定义的异常处理: "违反完整约束条件"

declare

  --1. 定义异常 

  temp_exception exception;

--2. 将其定义好的异常情况,与标准的 ORACLE 错误联系起来,使用 EXCEPTION_INIT 语句

  PRAGMA EXCEPTION_INIT(temp_exception, -2292);

begin

  delete from employees where employee_id = 100;

exception

  --3. 处理异常

  when temp_exception then

       dbms_output.put_line('违反完整性约束!');

end;

4. 自己定义异常: 更新指定员工工资,添加100;若该员工不存在则抛出用户自己定义异常: no_result

declare

  --自己定义异常                                  

  no_result exception;  

begin

  update employees set salary = salary + 100 where employee_id = 1001;

--使用隐式游标, 抛出自己定义异常

  if sql%notfound then

     raise no_result;

  end if;

exception

--处理器抛出的异常

  when no_result then

     dbms_output.put_line('更新失败');

end;

PL/SQL 异常处理程序的更多相关文章

  1. oracle学习笔记(十六) PL/SQL 异常和goto语句

    PL/SQL 异常和goto语句 异常 预定义异常 oracle常见预定义异常: 错误号 异常错误信息名称 说明 ORA-0001 DUP_VAL_ON_INDEX 试图破坏一个唯一性限制 ORA-0 ...

  2. PL/SQL 异常错误处理

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

  3. Oracle PL/SQL异常、存储过程和触发器

    一.异常 1.处理异常 (1)除数不为0 declare b number; begin b:; exception when zero_divide then dbms_output.put_lin ...

  4. PL/SQL异常

    CASE_NOT_FOUND CASE selector WHEN selector_value_1 THEN statements_1 WHEN selector_value_2 THEN stat ...

  5. PL/SQL异常获取

    1.no_data SET SERVEROUTPUT ON DECLARE pename EMP.ENAME % TYPE ; BEGIN SELECT ename INTO pename FROM ...

  6. PL\SQL结构控制、异常

    PL\SQL结构控制    1.IF条件控制语句(三种基本方式+IF语句的嵌套使用)        (1)IF...        (2)IF...ELSE        (3)IF...ELSIF. ...

  7. Oracle PL/SQL中异常高级特性

    在OraclePL/SQL语句块中exception的异常处理部分是非常重要的组成部分,它决定了在PL/SQL语句块内部可执行部分在发生异常错误时,程序是友好地提示:程序遇到某些错误而无法执行,还是抛 ...

  8. PL/SQL异常处理方法

    PL/SQL异常处理方法   1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...

  9. 整理课堂笔记 pl/sql orcale异常

      1>>>>>异常错误处理 1 >预定义的异常处理 预定义说明的部分 ORACLE 异常错误对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应 ...

随机推荐

  1. 排查一般MySQL性能问题

    排查一般MySQL性能问题,通常要记录下面几项信息: 1.mysql> show processlist; 2.mysql> show engine innodb status\G 3.表 ...

  2. 几种常见web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)(转)

    点击打开PDF下载链接 web 容器比较 tomcat jboss resin weblogic websphere glassfish 1. Tomcat是Apache鼎力支持的Java Web应用 ...

  3. JSON序列化自己主动过滤NULL值

    使用Newtonsoft.Json.dll 序列化为json时主动将NULL值过滤掉.详细做法: var jSetting = new JsonSerializerSettings {NullValu ...

  4. js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression)

    js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression) 一.总结 1.str_replace:正则作用:高效快速匹配 2.break ...

  5. Java多线程系列-线程创建

    1.怎样创建多线程? Java从语言级别实现多线程,因此实现一个多线程程序很easy.有两种方法能够实现多线程,即继承Thread类和实现Runnable接口.由于Java不支持多继承的原因,建议尽可 ...

  6. mac nginx php-fpm

    再一次被困在一个傻问题.由于我居然怀疑是不是mac本身就和centos的安装不一样.在一次次地排错后,最终发现.原来是我的nginx.conf的一行配置少写了一个字母.最后多亏用ls检查来定位到这个错 ...

  7. Android 用MediaRecorder录制视频太短崩的问题

    具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...

  8. jQuery 淡入淡出

    演示 jQuery fadeIn() 方法: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  9. 【U218】A-B

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一个A/B-C/D表示的分数减法算式,A,B,C,D均为不超过32767的正整数,求A/B-C/D ...

  10. IDEA 多线程Debug

    一.问题描述 在idea中的进行调试时,代码中有多线程,想对线程中的代码进行跟踪,代码如下: for (int i = 0; i < 5; i++) { final int index = i; ...