PL/SQL-异常处理机制

PL/SQL的语法中,存在异常处理机制。当PL/SQL程序出错时,会引发异常处理机制,异常处理代码通常放在PL/SQL块的exception中。说白了,就是出错了还能弥补过错。
异常分为两种:

  1. 预定义异常
    用户无需定义,也无需引发,由Oracle自动引发。
  2. 自定义异常
    用户自己定义,报错了能快速的定位错误

预定义异常

学习是为了学以致用,系统预定义的异常有很多,大约20个,这这里只介绍常用的几个。

  1. zero_divide【除数不能为0,当除数为0时引发异常】
    boolean型变量,返回值为true或false
    需求:计算两数和除以两数查的结果,若两个数相同,则输出“a和b相等。”
--不会引发异常的情况
set serveroutput on
declare
  a int:=100;
  b int:=200;
  c number;
begin
  c:=(a+b)/(a-b);
  dbms_output.put_line('两数和除以两数差等于'||c);
exception
  when zero_divide then
    dbms_output.put_line('a和b相等。');
end;
/
--会引发异常的情况
set serveroutput on
declare
  a int:=100;
  b int:=100;
  c number;
begin
  c:=(a+b)/(a-b);
  dbms_output.put_line('两数和除以两数差等于'||c);
exception
  when zero_divide then
    dbms_output.put_line('a和b相等。');
end;
/
  1. too_many_rows【返回多行数据,当返回多行数据时引发】
    boolean型变量,返回值为true或false
    需求:检查部门为10的员工是否只有一人,是的话输出“员工编号XXX的姓名为XXX”,若有多人,则返回“部门为10的员工不止一人。”
set serverpoutput on
declare
  var_ename emp.ename%type;
  var_empno emp.empno%type;
begin
--返回数据超过一行
  select empno,ename into var_empno,var_ename from emp where deptno=10;
  dbms_output.put_line('员工编号'||var_empno||'的姓名为'||var_ename);
exception
  when too_many_rows then
    dbms_output.put_line('部门为10的员工不止一人。');
end;
/
  1. no_date_found【若返回0行数据,则引发异常】
    boolean型变量,返回值为true或false
    需求:检查部门为50的员工是否存在,存在则输出“员工编号XXX的姓名为XXX”,若不存在,则返回“不存在部门为50的员工”
set serverpoutput on
declare
  var_ename emp.ename%type;
  var_empno emp.empno%type;
begin
--返回数据为空
  select empno,ename into var_empno,var_ename from emp where deptno=50;
  dbms_output.put_line('员工编号'||var_empno||'的姓名为'||var_ename);
exception
  when no_data_found then
    dbms_output.put_line('不存在部门为50的员工');
end;
/

自定义异常

在这里先介绍一种特殊的数据类型:异常类型(exception)

declare
  error_00001 exception; --定义异常变量
  pragma exception_init(error_00001,-00001); --将错误编号与异常变量绑定

绑定后,error_00001异常变量就可以当作预定义异常来使用了。

  1. 错误编号异常【将异常变量与系统的错误编号绑定,用异常变量来代替这类错误。】
    当Oracle系统发生错误时,会报错,报错会显示错误编号和相关描述信息。如:ORA-00001:违反唯一约束条件<…>
    对于一些要捕捉的异常,系统报错时显示的报错信息可能不是那么好理解,如可以把“ORA-00001:违反唯一约束条件<…>”显示为“主键不能重复!”,相信每个人看到这个报错都能快速的去检查主键是否重复。
set serveroutput on
declare
  error_00001 exception;
  pragma exception_init(error_00001,-00001);
begin
  insert into emp(empno,ename,sal) values(7369,'Abong',500);
  dbms_output.put_line('编号7369的名字为Abong,工资为500');
exception
  when error_00001 then
    dbms_output.put_line('主键不能重复');
end;
/
  1. 业务逻辑异常【自己决定什么时候引发异常,异常处理内容是什么】
    前面所讲的所有异常,可以说都是系统里有的。我们回看这个需求:
    计算两数和除以两数查的结果,若两个数相同,则输出“a和b相等。”
    如果要在begin中按自行检验,发现两个数相同,才引发异常,这种要怎么写呢?
set serveroutput on
declare
  a int:=100;
  b int:=100;
  c number;
  zero_divide_exception exception; --定义异常变量
begin
  if a=b then
    raise zero_divide_exception;  --何时引发异常
  else
    c:=(a+b)/(a-b);
    dbms_output.put_line('两数和除以两数差等于'||c);
  end if;
exception  
  when zero_divide_exception then   --当异常引发时,异常处理内容是什么?
    dbms_output.put_line('a和b相等。');
end;
/

以上就是PL/SQL中的异常处理机制,遇到错误不慌,只要设置好异常处理机制,就能快速的定位错误,并订正错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值