Oracle异常处理
异常在代码中的声明部分声明,在执行部分引发,在异常处理部分处理。一般异常分为两中:预定义异常和用户自定义异常。下面通过代码分别介绍异常的声明、执行、处理。
1、用户自定义异常
(a)异常声明
[*]DECLARE
[*]-- Exception to indicate an error condition
[*]e_DuplicateAuthors EXCEPTION;
同时在DECLARE部分声明其他三个变量,供下面函数使用
[*]v_Author1 books.author1%TYPE;
[*]v_Author2 books.author2%TYPE;
[*]v_Author3 books.author3%TYPE;
(b)异常引发,用户自定义异常是通过RAISE语句显示引发,而预定义异常则是在与它们关联的Oracle错误发生时候隐式引发的。异常引发代码如下:
[*]BEGIN
[*]/* Find the IDs for the 3 authors of 'Oracle9i DBA 101' */
[*]SELECT author1, author2, author3
[*] INTO v_Author1, v_Author2, v_Author3
[*] FROM books
[*] WHERE title = 'Oracle9i DBA 101';
[*]
[*]/* Ensure that there are no duplicates */
[*]IF (v_Author1 = v_Author2) OR (v_Author1 = v_Author3) OR
[*] (v_Author2 = v_Author3) THEN
[*] RAISE e_DuplicateAuthors;
[*]END IF;
(c)异常处理
[*] EXCEPTION
[*]WHEN e_DuplicateAuthors THEN
[*] INSERT INTO log_table (info)
[*] VALUES ('Oracle9i DBA 101 has duplicate authors');
[*]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() violated
该错误对应的异常就是DUP_VAL_ON_INDEX异常。
[*]BEGIN
[*]INSERT INTO authors (id, first_name, last_name)
[*] VALUES (20000, 'John', 'Smith');
[*]INSERT INTO authors (id, first_name, last_name)
[*] VALUES (20000, 'Susan', 'Ryan');
[*]END;
(c)异常处理
异常引发后,将不会执行下面这条语句,直接跳出异常。
[*]INSERT INTO authors (id, first_name, last_name)
[*]VALUES (20000, 'Susan', 'Ryan');
页:
[1]