Oracle异常处理

    异常在代码中的声明部分声明,在执行部分引发,在异常处理部分处理。一般异常分为两中:预定义异常和用户自定义异常。

    下面通过代码分别介绍异常的声明、执行、处理。

1、用户自定义异常

(a)异常声明

  
  
  
  
  1. DECLARE 
  2.   -- Exception to indicate an error condition 
  3.   e_DuplicateAuthors EXCEPTION; 

同时在DECLARE部分声明其他三个变量,供下面函数使用

  
  
  
  
  1. v_Author1 books.author1%TYPE; 
  2. v_Author2 books.author2%TYPE; 
  3. v_Author3 books.author3%TYPE; 

(b)异常引发,用户自定义异常是通过RAISE语句显示引发,而预定义异常则是在与它们关联的Oracle错误发生时候隐式引发的。异常引发代码如下:

  
  
  
  
  1. BEGIN 
  2.   /* Find the IDs for the 3 authors of 'Oracle9i DBA 101' */ 
  3.   SELECT author1, author2, author3 
  4.     INTO v_Author1, v_Author2, v_Author3 
  5.     FROM books 
  6.     WHERE title = 'Oracle9i DBA 101'
  7.    
  8.   /* Ensure that there are no duplicates */ 
  9.   IF (v_Author1 = v_Author2) OR (v_Author1 = v_Author3) OR 
  10.      (v_Author2 = v_Author3) THEN 
  11.      RAISE e_DuplicateAuthors; 
  12. END IF; 

(c)异常处理

  
  
  
  
  1.  EXCEPTION 
  2.   WHEN e_DuplicateAuthors THEN 
  3.     INSERT INTO log_table (info) 
  4.       VALUES ('Oracle9i DBA 101 has duplicate authors'); 
  5. end; 

2、预定义异常

预定义异常列表

Oracle错误编号 等价异常名称 说明
ORA-0001 Dup_val_on_index 违反了唯一性限制
ORA-0051 Timeout-on-resource 在等待资源时发生超时
ORA-0061 Transaction-backed-out 由于发生死锁事务被撤消
ORA-1001 Invalid-CURSOR 试图使用一个无效的游标
ORA-1012 Not-logged-on 没有连接到ORACLE
ORA-1017 Login-denied 无效的用户名/口令

ORA-1403

 
No_data_found SELECT INTO没有找到数据
ORA-1422 Too_many_rows SELECT INTO 返回多行
ORA-1476 Zero-divide 试图被零除
ORA-1722 Invalid-NUMBER 转换一个数字失败
ORA-6500 Storage-error 内存不够引发的内部错误
ORA-6501 Program-error 内部错误
ORA-6502 Value-error 转换或截断错误
ORA-6504 Rowtype-mismatch 宿主游标变量与 PL/SQL变量有不兼容行类型
ORA-6511

CURSOR-already-OPEN

 
试图打开一个已处于打开状态的游标
ORA-6530 Access-INTO-null 试图为null 对象的属性赋值
ORA-6531 Collection-is-null 试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray
ORA-6532 Subscript-outside-limit 对嵌套或varray索引得引用超出声明范围以外
ORA-6533 Subscript-beyond-count 对嵌套或varray 索引得引用大于集合中元素的个数
     

 

(a)异常声明

    由于预定义异常是在与它们关联的Oralce错误发生的时候隐式引发的,所以不需要异常声明。

(b)异常引发

    下面这段程序是向authors表中插入主键重复的记录。因此当第二条INSERT试图插入的时候,就会引发了这个错误:

     ORA-0001:unique constraint(<constraint name>) violated

     该错误对应的异常就是DUP_VAL_ON_INDEX异常。

  
  
  
  
  1. BEGIN 
  2.   INSERT INTO authors (id, first_name, last_name) 
  3.     VALUES (20000, 'John', 'Smith'); 
  4.   INSERT INTO authors (id, first_name, last_name) 
  5.     VALUES (20000, 'Susan', 'Ryan'); 
  6. END;  

(c)异常处理

     异常引发后,将不会执行下面这条语句,直接跳出异常。

  
  
  
  
  1. INSERT INTO authors (id, first_name, last_name)  
  2. VALUES (20000, 'Susan', 'Ryan'); 

 

 

你可能感兴趣的:(oracle,异常处理)