Oracle (2) 异常处理(预定义、非预定义、自定义)

版权声明: https://blog.csdn.net/aic1999/article/details/82826841

目录

异常处理

1、预定义异常

2、非预定义异常

3、自定义异常


异常处理

【导言】抛异常是为了运行的时候不报错,并提示这段代码运行的结果有问题,让开发者针对这个异常做特定处理(写代码)。

1、预定义异常

【通用结构】

exception

    when  系统已经定义好的异常  then 出现异常的处理方法;

【导言】如果我们查询的数据是表中不存在的,那么运行后,就会直接报错,停止运行。

declare
    v_sname student.sname%type;    --也可以v_sname varchar(10);这样定义
begin
    select sname into v_sname from student where sno='0000000000';
end;

【例题】查询学号为'0000000000'的学生姓名,如果没有这个学生则抛出异常,输出“没有查询到数据”。

【输出】没有查询到数据

declare
    v_sname student.sname%type;    --也可以v_sname varchar(10);这样定义
begin
    select sname into v_sname from student where sno='0000000000';
    exception
        when  no_data_found  then dbms_output.put_line('没有查询到数据');
end;

【解析】由于"no_data_found'是系统已经定义好的异常(错误代码大全),他有错误原因:查不到数值,错误代码ORA-01403,也有定义好的名字“not_data_found”。故可以直接用。

2、非预定义异常

【通用结构】非预定义异常

declare

异常名 exception;

begin

    pragma exception_init(我们起的名字,错误代码) ;

exception

    when  系统已经定义好的异常  then  出现异常的处理方法;

end;

【导言】在上面那个例子中,我们知道,错误原因:没有数据。他有错误代码(ORA-01403)和错误名字“not_data_found”。

但是错误原因(错误代码)那么多,不可能每一个错误都有类似“no_data_found”这样的名字的,所以有时候需要利用非预定义异常,我们亲自为系统能识别到的错误(有错误代码的)起个名字。 

假如插入一行已经存在的数据,会显示:

declare 
begin
  insert into score values('11111','A001',76);
end;

他有错误代码,却没有名字,所以需要我们使用非预定义异常,为这个错误代码起个名字。

【例题】插入一条数据(假设我们不知道这个数据表中已经存在)【输出:该条记录已存在】

declare 
  e_exist exception;
  pragma exception_init(e_exist,-02291);
begin
  insert into score values('11111','A001',76);
  exception
     when e_exist then dbms_output.put_line('该条记录已存在');
end;

 

3、自定义异常

【通用结构】自定义异常

declare

异常名 exception;(定义异常)

begin

raise 异常名 (触发异常)

exception

    when  系统已经定义好的异常  then  出现异常的处理方法;(解决异常)

end;

【导言】 我们觉得哪种结果是“异常”的,就能定义。比如让程序从0开始,循环输出人类最大的岁数,对于计算机而言,循环到上百万都没问题,这对计算机而言不是异常,但实际上哪有人类能活这么久,所以我们就能将超过100的数,当作异常。

【例题】用户自定义异常,求1+2+3....+100的值,在求和的过程中如果发现结果超出1000,则抛出异常,并停止求和。

declare
  err_outrange exception;
  s int:=0;
begin 
  for i in 1..100
  loop 
    s:=s+i;
    if s>1000 then            --触发异常的条件
      raise err_outrange;      --raise,触发异常
    end if;
  end loop;
  dbms_output.put_line(s);
  exception
     when err_outrange then dbms_output.put_line('超出范围,停止计算');
end;

【输出】超出范围,停止计算

猜你喜欢

转载自blog.csdn.net/aic1999/article/details/82826841
今日推荐