异常在代码中的声明部分声明,在执行部分引发,在异常处理部分处理。一般异常分为两中:预定义异常和用户自定义异常。
下面通过代码分别介绍异常的声明、执行、处理。
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 | 无效的用户名/口令 | ||
|
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 |
|
试图打开一个已处于打开状态的游标 | ||
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异常。
- 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');