异常处理呢!也是一个非常重要的知识点,是很多数据库(Oracle ,MySQL)都有的内容,所以学好它也是很重要的,这篇文章就接着上篇文章,继续探讨PL/SQL编程的内容。
异常:是PL/SQL程序块出错或被警告时,给客户的提醒
现在的异常分为:预定义异常,自定义异常(又分为:1. 错误编号异常,2. 业务逻辑错误),现在来分别看看不同的异常。
1. 预定义异常:数据库已经写好的一些异常种类,供咱们直接使用。
下面列出异常种类,以及对一部分进行演示:
图上是描述了,预定义的异常,现在知道这么多的异常,也该做个演示了:
例子:declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp
where empno=&emp_no;
dbms_output.put_line('雇员名'||v_ename);
exception
when no_data_found then
dbms_output.put_line('雇员号不存在,请重新输入'||v_ename);
end;
这是咱们经常使用的异常,从上图中可以查出no_data_found是没有查询到数据的异常。
大家可以看出来,预定义异常就是定义好,让咱们用户进行使用的,咱们只要知道这个异常使用格式,并记住几个常用的预定义异常就好啦!!!
废话少说,上格式:
when 预定义异常错误名称 then
在该异常下的提示信息
这个格式是不是很简单,但是注意我这是简略的格式,你可以看看我上面写的完整代码噢。
忘记说了,还有一个很重要的异常错误名称:“others”,这可是万能异常,如果你有异常想不起来错误名称,又想有报异常提醒的功能,这个就是你的不二人选喽!!!
但是,你也能看出来,others类似与java中导报的“ * ”,虽然全,但不具体,相对来说,效率就有所下降,所以在巨大量的代码中,要考虑效率呦!!!
- 自定义异常:
好多教材把异常分为,预定义异常,非预定义异常,自定义异常。感觉有点啰嗦,你们认为大致分为几个类呢!!
这边说说自定义异常的步骤:
(1) 在定义部分定义异常名
(2) 在异常和Oracle的错误建立练习
(3) 在异常部分捕捉异常
<1>错误编号异常
遵从自定义异常的步骤可以简写为
declare
声明异常,例:dept_null_error exception;(定义了一个名为“dept_null_error”的异常。)
可在此处建立关联,例:pragma exception_init(dept_null_error,-1400);(此处使用伪过程把咱们定义的异常和错误编号-1400关联起来,)
(伪过程格式:pragma exception_init(异常名,错误编号);)
begin
此处也可以建立关联:
例:if a=0 then
raise dept_null_error;
end if;
raise语句,即触发语句,,此句话的意思是:当a等于零时触发dept_null_error异常。
这可以看出在声明部分和程序开始的区域进行关联,但是注意,不同的语句,写的位置时不尽相同的。
另外,一个异常只要有一个关联即可,这里我是为演示。
exception
捕捉异常 ,这边就不过多的演示了
end;
这里就要注意啦,预定义异常,错误编号异常,业务逻辑异常的区别:
这里就要说说几个东西了,即:sqlcode(错误编号),sqlerrm(错误信息),错误名称,关联。
其实,大家看看就已经明白了这四个名词的抽象意义,这就从这四者来看看三种异常的区别:
1. 预定义异常:四者都已经定义好了,且名称与错误编号也进行了关联。
2. 错误编号异常:这个是数据库定义了很多没有关联的sqlcode和sqlerrm,这里就是自定义一个异常名,并于想要实现功能的sqlcode进行关联。
3. 业务逻辑错误:这个很明显,这个不是触发了数据库中的约束,等规则所形成的异常,例:半个人,不可能吧,这就是一个业务逻辑异常,从这四方面说就是:四个东西,数据库都没有做好,自己来!!!
对喽:对于部分自定义的异常可以不用sqlcode,例如:raise语句,直接触发。(上面的异常处理主要是对用sqlcode的异常进行分类的,不要钻牛角尖哦!!!)
- 业务逻辑错误
这个我不想细讲了,因为前面说了很多了,一切东西自己来,咱们就自己建就是:
例:
declare
v_sal number;
e_sal_error exception;
begin
select sal into v_sal from emp where empno=&emp_no;
if v_sal>=2500 then
dbms_output.put_line('该雇员工资:'||v_sal);
raise e_sal_error;
end if;
exception
when e_sal_error then
dbms_output.put_line('该雇员工资高于2500了');
end;
这里使用的是无sqlcode的方法,
例:
declare
v_sal number;
e_sal_error exception;
begin
select sal into v_sal from emp where empno=&emp_no;
if v_sal>=2500 then
raise_application_error(-20001,'该雇员工资超过2500');
end if;
exception
end;
注意:又一条关联语句: raise_application_error(错误编号,'自定义信息',[true/false(此部分可选,是否把错误消息放入错误栈中。)]);
例: raise_application_error(-20001,'该雇员工资超过2500');
这边整理一下几个关联语句:
1.伪过程格式:pragma exception_init(异常名,错误编号);【用于声明部分】
2. raise语句: raise 异常名;即触发语句
3. 定义错误代码以及错误消息文本:raise_application_error(错误编号,'自定义信息',[true/false(此部分可选,是否把错误消息放入错误栈中。)]);