异常错误处理

一个优秀的程序都应该可以正确处理各种出错情况,并尽可能从错误中恢复。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连接错误:ora-12705:cannot access NLS data files or invalid environment specified

    适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...

  5. PL/SQL异常

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

  6. PL/SQL异常获取

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

  7. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

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

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

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

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

随机推荐

  1. ionic3 打包发布,以安卓说明

    1 添加图标 ionic cordova resources [<platform>] 官方https://ionicframework.com/docs/cli/cordova/reso ...

  2. 【cocos2d-js官方文档】二十一、v3相对于v2版本的api变动

    分类: cocos2d-js(28) 目录(?)[+] CCAudio.js SimpleAudioEngine.js改名为CCAudio.js. AudioEngine中删除了以下几个方法: pre ...

  3. 贮油点问题(C++)

    贮油点问题…..一道送命系列的递推… 描述 Description 一辆重型卡车欲穿过S公里的沙漠,卡车耗汽油为1升/公里,卡车总载油能力为W公升.显然卡车装一次油是过不了沙漠的.因此司机必须设法在沿 ...

  4. tomcat安装规范

    创建用户 useradd -u 501 tomcat passwd tomcat tomcat安装 tar zxf apache-tomcat-8.5.5.tar.gz -C /usr/local/ ...

  5. Python RE模块中search()和match()的区别

    match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配: 也就是说match()只有在0位置匹配成功的话才有返回, 如果不是开始位置匹配成功的 ...

  6. 【MySQL笔记】数据定义语言DDL

    1.创建基本表   create table <表名> (<列名><数据类型>[列级完整性约束条件]                                 ...

  7. Python自带的hmac模块

    Python自带的hmac模块实现了标准的Hmac算法 我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下: import hmac mess ...

  8. 获取OS X中App Store更新后的安装包(如XCode)

    如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽.   为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...

  9. Android中将Bitmap转换成单色的Bmp图片

    添加权限 :

  10. Oracle TRCA 工具 说明 10046

    本篇文章主要介绍了"Oracle TRCA 工具 说明 ",主要涉及到Oracle TRCA 工具 说明 方面的内容,对于Oracle TRCA 工具 说明 感兴趣的同学可以参考一 ...