什么是例外呢?是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
Java中的例外:
Try{
}catch(exception1 e1){
}catch(exception2 e2){
}finally{}
Java的exception处理是向上处理机制,页脚父类处理机制。下面的那一行调用上面的那一行。比如在这个方法中没有处理这个异常,那么就向上抛,上面的方法也没有处理,就在下面一行打印exception信息,再抛,直到抛给JVM为止。
PL/SQL的exception。
与Java的区别就是没有finally。
分为系统定义的例外和用户自定义例外。
系统定义的例外有:
No_data_found(没有找到数据)
Too_many_rows(select … into 语句匹配多个行)
Zero_divide(被0除)
Value_error(算术或转换错误)
Timeout_on_resource(在等待资源发生时超时)
分布式数据库:
物理上不在一起,逻辑上在一起的数据库。
两个数据库之间通过数据库链路访问,可以使网线。
一个数据库向另一个数据库发送请求,请求超时,就抛出Timeout_on_resource。
--被0除的例外
Set serveroutput on
Declare
Pnumnumber;
Begin
Pnum:= 1/0;
Exception
--when表示,当是这个例外的时候,这样处理,
WhenZero_Divide then dbms_output.put_line(‘0不能做被除数’);
WhenValue_error then dbms_output.put_line(‘算术转换错误’);
--要抓住所有的例外,否则会抛给数据库,使用when others
Whenothers then dbms_output.put_line(‘其他例外’);
End;
/
自定义例外:
定义变量时:No_data exception。当成变量定义。
--查询50号部门的员工姓名。没有找到员工的时候就抛出一个自定义例外。
Set serveroutput on
Declare
--定义一个光标,代表50号部门的员工。
Cursorcemp is select ename from emp where deptno=50;
Penameemp.ename%type;
--自定义例外
No_emp_foundexception;
Begin
Opencemp;
--取一个员工,因为50号部门不存在,所以取不到
Fetchcemp into pename;
Ifcemp%notfound then
--抛出一个例外。
Raiseno_emp_found;
Endif;
--Oracle设定:如果在PL/SQL执行中,如果产生例外,自动关闭光标。
Closecemp;
Exception
Whenno_emp_found then dbms_output.put_line(‘没有找到员工’);
Whenothers then dbms_output.put_line(‘其他例外’);
End;
/
这里有个问题,如果一个语句抛出例外,后面的语句将不执行。但是关闭光标的语句会自动执行。