PL/SQL 异常处理程序



异常处理程序

一个好的程序应该能够妥善处理各种错误情况,并尽可能从错误中恢复。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;

时间: 2024-10-27 08:03:01

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

PL/SQL 异常错误处理

 异常错误处理 一个优秀的程序都应该可以正确处理各种出错情况,并尽可能从错误中恢复.ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理 ①有三种类型的异常错误: 1. 提前定义( Predefined )错误 ORACLE提前定义的异常情况大约有24个.对这样的异常情况的处理.无需在程序中定义,由ORACLE自己主动将其引发. 2. 非提前定义( Predefined )错误 即其它标准的ORACLE错误. 对这样的异常情况的处理,

PL/SQL异常处理方法

1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: 1:异常类型 2:错误代码 3:错误信息 通过处理异常我们能够确保PL/SQL块不突然的异常退出. 2:异常处理的结构 DECLARE Declaration section BEGIN Exception section EXCEPTION WHEN ex_name1 THEN -Error handling stateme

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

  1>>>>>异常错误处理 1 >预定义的异常处理 预定义说明的部分 ORACLE 异常错误 对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可.例1:更新指定员工工资,如工资小于1500,则加100: DECLARE v_empno employees.employee_id%TYPE := &empno; v_sal employees.salary%TYPE;BEGIN SELECT sa

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

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

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

[推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定要支持与推荐呀~! 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常

PL/SQL 编程(一)基础,变量,分支,循环,异常

SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL).可以方便的调用相应语句来去的结果,特点是非过程化,使用的时候不用指明执行的具体方法,不用关注实现的细节,但是某些情况下满足不了复杂业务流程的需求. PL/SQL是 Procedure Language & Structured Query Language 的缩写.属于第三代语言(3GL),是一种过程化语言.PL/SQL是

PL/SQL 08 异常 exception

--PL/SQL错误  编译时  运行时 --运行时的出错处理  EXCEPTION --异常处理块DECLARE -BEGIN -EXCEPTION WHEN OTHERS THEN  handler_error(-);END; --用户自定义的异常DECLARE e_TooManyStudents EXCEPTION; -BEGIN - RAISE e_TooManyStudents; -EXCEPTION WHEN e_TooManyStudents THEN  -END; --预定义的O

PL/SQL: Statement ignored 异常 关于存储过程的调用

C:\Java\jdk8\bin\java -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Installed\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=3706:D:\Installed\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Installed\IntelliJ IDEA 2017

PL/SQL预定义异常

预定义的异常 PL/SQL提供了许多预定义的异常,这些异常在程序违反任何数据库规则时执行. 例如,当SELECT INTO语句不返回任何行时,会引发预定义的异常NO_DATA_FOUND.下表列出了一些重要的预定义异常情况 - 异常 Oracle错误代码 SQLCODE 描述 ACCESS_INTO_NULL 06530 -6530 当一个空对象被自动分配一个值时会引发它. CASE_NOT_FOUND 06592 -6592 当没有选择CASE语句的WHEN子句中的任何选项时,会引发这个错误,