PL/SQL异常处理机制(预定义异常、非预定义异常、用户自定义异常)


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;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值