声明异常
如:
DECLARE
e_nodeptno EXCEPTION;
BEGIN
NULL;
END;
异常的声明跟变量的声明非常相似,其类型为EXCEPTION。不过异常是一种错误的表示形式,而不是一个真正的变量,因此不能在赋值语句或SQL语句中使用异常,但是异常和变量的作用范围和规则是相同的。
作用域范围
- 在同一个块中不能声明一个异常两次,但是可以在不同的块中声明相同的异常。
- 在一个块中声明的异常在本块中和其子块中可见,也就是说内层块可以引用在外层块和本块中定义的异常,但是不能引用在子块中定义的异常。
- 如果在子块重新声明外部块中同名的异常,将覆盖外部块中的全局异常,使得子块不能引用外部块中的全局异常,但是可以在标签块中声明相同的异常。
抛出异常
预定义异常是当有关Oracle错误产生时,由Oracle隐式抛出的;自定义异常需要显式地使用RAISE进行抛出。
不过RAISE也可以抛出预定义的异常。
如:
DECLARE
e_nocomm EXCEPTION; --自定义的异常
v_comm NUMBER (10, 2); --临时保存提成数据的变量
v_empno NUMBER (4) := &empno; --从绑定参数中获取员工信息
BEGIN
SELECT comm INTO v_comm FROM emp WHERE empno = v_empno; --查询并获取员工提成
IF v_comm IS NULL --如果没有提成
THEN
RAISE e_nocomm; --触发异常
END IF;
EXCEPTION
WHEN OTHERS THEN --OTHERS必须单独出现
DBMS_OUTPUT.put_line ('错误编码:'||SQLCODE||' 错误消息:'||SQLERRM(100));
RAISE; --重新抛出异常
END;
处理异常
如:
DECLARE
e_nocomm EXCEPTION;
...
BEGIN
...
EXCEPTION
WHEN e_nocomm THEN
...
WHEN NO_DATA_FOUND THEN
...
WHEN OTHERS THEN
...
END;