ORACLE学习之PL/SQL中异常

来源:互联网 发布:仓库数据流程图 编辑:程序博客网 时间:2024/06/05 23:45

PL/SQL处理异常的基本语法

declare


begin

EXCEPTION

WHEN  exception1   [or exception2]   THEN   

statement

WHEN  exception3   [or exception4]    THEN

statement

WHEN OTHERS THEN 

statement

end;


异常类型:

1、预定义异常

ORACLE 本身自己已经定义了号名称的常用异常,Oracle 一共提供了25中预定义异常。

         常用的有:NO_DATA_FOUND、TOO_MANY_ROWS、ZERO_DIVIDE、CASE_NOT_FOUND等

可以通过如下SQL查询ORACLE预定义的25中异常

select * from DBA_SOURCE where name='STANDARD' and text like '%EXCEPTION_INIT%'

2、非预定义异常

Oracle中很多异常都是非预定义的,他们只有错误编号和相关的错误描述,而没有名称的异常是不能被捕获的。

        为了解决这个问题Oracle允许开发人员为这样的异常添加一个名称,使得他们能够被异常处理模块捕获。

示例:

-- Created on 2017/8/2 by ADMINISTRATOR 
declare 
  v_info varchar2(200);
  my_2291_exp EXCEPTION; --声明一个异常
begin
  v_info:='test';
  UPDATE STAFF SET STAFF.WAREA_ID=v_info WHERE STAFF.STAFF_ID=2; --此处修改STAFF一个不存在的部门
  EXCEPTION
    WHEN my_2291_exp THEN
      DBMS_OUTPUT.put_line('违反完整约束条件,未找到父项关键字' );
      DBMS_OUTPUT.put_line(SQLERRM);--异常说明
      DBMS_OUTPUT.put_line(SQLCODE);--异常代码
      ROLLBACK;
end;

3、自定义异常

开发中遇到与业务有关的错误,如数量不能为负数,性别必须是男或者女等。这些不属于系统错误,

        因此不能使用预定义异常和非预定义异常来捕捉它们。

示例:

-- Created on 2017/8/2 by ADMINISTRATOR 
declare 
  -- Local variables here
  test_exp EXCEPTION;
  PRAGMA EXCEPTION_INIT(test_exp,-20001); --错误号范围是 -20999 ~ -20000 之间的整数
begin
  -- Test statements here
  if 1>0 then
    RAISE test_exp; -- 显式抛出异常
  end if;
  EXCEPTION
    WHEN test_exp THEN
      DBMS_OUTPUT.put_line('这里接住异常');
    WHEN OTHERS THEN
      DBMS_OUTPUT.put_line('未找到匹配异常');
end;

原创粉丝点击