PL/SQL之二 异常处理

来源:互联网 发布:禅道数据库配置 编辑:程序博客网 时间:2024/05/16 05:10

1.概述

(1)异常:指PL/SQL的运行时错误。
(2)任何PL/SQL块都可以有一个异常处理块,其中可以包含一个或多个异常处理器,格式:

     EXCEPTION             when ex1 then 语句1             when ex2 or ex3 then 语句2             when others then 语句3

(3)异常类型:内置异常;自定义异常。
  A:内置异常
  它是以ora-n的错误;如果发生这类错误,系统会隐式的抛出。常见:no_data_found|too_many_rows|zero_divide|value_error等。
  B:自定义异常
  可用 ex_name EXCEPTION进行定义;必须显示抛出。

2.异常声明

(1)内置的异常,无需声明,可直接使用;自定义异常需要单独声明。(2)声明语法:       ex_name EXCEPTION (3)关联异常与错误代码       PRAGMA  EXCEPTION_INIT(ex_name,error_code)

3.异常抛出

(1)RAISE      raise:将当前捕获到的异常原样抛出。      raise ex_name:将抛出名为ex_name的异常。(2)RAISE_application_error(用于未命名的自定义异常,将错误编号和错误文本关联起来)    作用:用于未命名的自定义异常,将错误编号和错误文本关联起来。    格式:raise_application_error(error_code,message);或  raise_application_error(erro_code,message,keep_errors);    error_code:错误编码,范围在-20999到-20000之间。    message:错误文本,最多包含2048个字符。    keep_errors:它是Boolean参数,为True时,新错误被添加到已经抛出的错误列表中;为false时,新错误会替换已经抛出的错误栈。         

4.异常处理

  1. 预定义异常
    定义部分:异常名称 Exception;
          PRAGMA EXCEPTION_INIT(错误名,- 错误代码); 将错误名称、错误代码关联起来。
    异常处理:
         when 错误名 then
            语句块;
  2. 自定义异常
    定义部分:异常名称 Exception;
    抛出异常:Raise 异常名称;
    异常处理:
         when 异常名称 then
          语句块;

5.自定义异常示例

自定义异常示例一:

declare --1.声明异常 e_invalid_id exception; v_num number:=1;begin  if v_num =1 then    raise e_invalid_id;--2.抛出异常  end if;Exception  when e_invalid_id then  --3.发生异常时处理      dbms_output.put_line('My first exception!');end;

示例二:

--自定义异常DECLARE  xiao_dog EXCEPTION;--声明部分      n_num NUMBER(2):=10;BEGIN      IF n_num=10 THEN RAISE xiao_dog; --通过raise 异常名来抛出异常      END IF;EXCEPTION       WHEN xiao_dog THEN  --发生异常时做什么          dbms_output.put_line(' xiao_dog exception ......');END;

Raise_application_error示例:

declare v_num number:=1;begin  if v_num =1 then       raise_application_error(-20001,'错误文本区域,这是第二个错误。');  end if;Exception when others then        raise;end;

exception_init示例:

declare  v_zip zipcode.zip%type:=&sv_zip;  e_child_exists exception;  pragma exception_init(e_child_exists,-2292);begin  delete from zipcode where zip=v_zip;  dbms_output.put_line('zip'||v_zip||' has been deleted');  commit;Exception   when e_child_exists then     dbms_output.put_line('Delete students for this zipcode first');end;

6.异常传播

  内部块的异常如果有没有异常处理部分,直接跳转到外部块中的异常处理部分;如果内部块中有异常处理部分,先执行内部异常处理,再跳到外部块,继续执行外部块里的内容。
  声明处发生异常会直接跳转到此块所属块的异常处理部分;如果没有就直接转到主机环境。

7.异常内置函数

SQLCODE:返回错误编号
SQLERRM:返回错误信息,错误信息最大长度为512字节。
示例:

declare  v_student_id number:=101;    v_name varchar2(30);begin    select rtrim(first_name)||' '||rtrim(last_name) into v_name  from student where student_id=v_student_id;Exception  when others then    dbms_output.put_line('错误代码:'||SQLCODE);   dbms_output.put_line('错误文本:'||substr(SQLERRM,1,200));end;  
原创粉丝点击