PL/SQL异常处理机制
异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行
异常分为三类:预定义异常、非预定义异常、自定义异常
预定义异常
ORACLE预定义的异常情况大约有21个。对这种异常情况的处理,无需在程序中定义声明,由ORACLE自动将其引发。
常见的预定义异常有: 更多见:https://www.yiibai.com/plsql/plsql_exceptions.html
预定义异常 | 描述 |
---|---|
no_data_found | 无数据找到 |
too_many_rows | 返回多条数据 |
zero divide | 除数不能零 |
cursor_already_open | 打开已经打开的游标 |
value_error | 赋值异常 |
invalid_cursor | 失效的游标 |
dup_val_on_index | 唯一索引插入重复值,即违反了主键约束 |
DECLARE
v_emp emp%rowtype;
BEGIN
SELECT empno, ename INTO v_emp.empno, v_emp.ename FROM emp; --信息数据返回多行
dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);
EXCEPTION
WHEN too_many_rows THEN --异常处理
dbms_output.put_line('返回数据过多!');
END;
非预定义异常
非预定义指的是,行为违反了Oracle的规则,有报错编号和报错信息,但是系统并未定义异常名称,那么我们自己将这种错误定义一个名字,并将名字和错误号绑定。
DECLARE
FK EXCEPTION; --定义异常
--异常跟定义好的异常变量相关联
pragma exception_init(FK, -02292); --当报-02292错误码的时候,定义错误为“FK”
BEGIN
DELETE FROM dept WHERE deptno = 30; --如果没有异常处理,将报-02292,事实上是违反了外键约束
EXCEPTION
--错误处理
WHEN FK THEN --当出现‘v_deptno_error’错误时,报“没有该部门编号!”
dbms_output.put_line('违反了外键约束!');
END;
用户自定义异常
PL/SQL允许根据程序的需要定义自己的异常。 用户定义的异常必须声明,然后使用RAISE语句或过程DBMS_STANDARD.RAISE_APPLICATION_ERROR显式地引发。
自定义一个异常,并处理:
DECLARE
v_sal emp.sal%TYPE;
v_sal_error EXCEPTION; --自定义异常
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno = &empno;
IF(v_sal < 3000) THEN
--1、抛出异常
RAISE v_sal_error; --抛出了异常名就一定要有处理,否则会报错
ELSE
dbms_output.put_line(v_sal);
END IF;
EXCEPTION
WHEN v_sal_error THEN
dbms_output.put_line('薪资少于3000');
WHEN others THEN --其他任意异常
dbms_output.put_line('系统异常');
END;
DECLARE
no_result EXCEPTION; --自定义异常
BEGIN
UPDATE employees SET salary = salary + 100 WHERE employee_id = 1001;
--使用隐式游标, 抛出自定义异常
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
EXCEPTION
--处理程序抛出的异常
WHEN no_result THEN
dbms_output.put_line('更新失败');
END;