PL/SQL提供了良好的异常处理机制,当程序运行出现错误时就会触发异常。异常被触发时,程序执行即终止,在PL/SQL块中提供了异常处理的部分,从而可以捕获一个异常进行特殊处理。
严格意义上来讲,一个完整的PL/SQL块应该具有以下结构:
declare--declare variablesbegin--execute & exception raisedexception--handle exceptionend;
?oracle数据库预先定义了一系列异常,以下是常见的一些:
? ? ACCESS_INTO_NULL(ORA-06530):引用对象类型变量的属性时,未对变量进行初始化;
? ? CASE_NOT_FOUND(ORA-06592):使用case-when结构时,未使用else子句,并且处理了不包含的case条件;
? ? COLLECTION_IS_NULL(ORA-06531):引用集合类型元素时,未对集合类型变量初始化;
? ? CURSOR_ALREADY_OPEN(ORA-06511):使用open命令打开已经处于打开状态的显式游标;
? ? DUL_VAL_ON_INDEX(ORA-00001):在唯一约束的列上插入重复的值时会触发;
? ? INVALID_NUMBER(ORA-01722):不能将字符转换为合理的数字时会触发;
? ? NO_DATA_FOUND(ORA-01403):select语句未返回行或引用未初始化的索引表元素;
? ? TOO_MANY_ROWS(ORA-01422):select into时,返回数据超过一行时即被触发;
? ? ZERO_DEVIDE(ORA-01476):除0异常;
?
? ? SUBSCRIPT_BEYOUND_COUNT(ORA-06533):使用数组类型是,下标超出元素范围;
? ? SUBSCRIPT_OUTSIDE_LIMIT(ORA-06532):使用嵌套表或Varry元素时,使用了负数作为下标;
? ? VALUE_ERROR(ORA-06502):赋值操作时,变量长度不足以容纳实际数据长度
? ? ROWTYPE_MISMATCH(ORA-06504):位游标变量赋值时,返回类型与游标定义类型不一致
除这些异常之外,开发者也可以进行自定义异常,并自定义处理规则。自定义异常的处理步骤如下:
1.在declare部分定义一个异常变量;
2.在begin处理中使用raise抛出一个异常;
3.在exception部分进行处理
其中,使用SQLCODE,SQLERRM这两个函数可以查看错误号和对应的错误消息;
?
RAISE_APPLICATION_ERROR(ERR_NUMBER,ERR_MSG,[TRUE|FALSE]):
? ? 该语法用于自定义错误消息,err_number必须在-20000到-20999之间,err_msg指定错误消息,长度不能超过2048字节,第三个值用于控制错误堆栈信息的存放内容,默认为false,即触发时会替换之前所有的错误,指定为true时会将这次的错误存放在错误堆栈中。只能在过程、函数、触发器、包中使用,不能在匿名块或子程序中使用;
? ? 使用以下代码建立存储过程,用于触发一个自定义错误消息的异常:
create or replace procedure comm_r( eno number,comm number) is v_comm emp.comm%type;begin select comm into v_comm from emp where empno=eno; if v_comm is null then raise_application_error(-20001,'This guy has no comm!'); end if;exception when no_data_found then dbms_output.put_line('No such emp exists');end;
?使用以下命令调用,得到结果如下:
SQL> exec comm_r(7788,100);begin comm_r(7788,100); end;ORA-20001: This guy has no comm!ORA-06512: 在 "SCOTT.COMM_R", line 8ORA-06512: 在 line 1
?
?