异常处理

declare
  sNum number := 0;
begin
  sNum := 5 / sNum;  
  dbms_output.put_line(sNum);
exception 
  when others then
    dbms_output.put_line('is Error!');
end;

自定义异常

declare
       ex_custom_invaild_age exception; `自定义的异常myerr
       age int;
begin
     age := &请输入年龄;
     if (age < 0) then
        raise ex_custom_invaild_age; `引发自定义异常
     else
        dbms_output.put_line('年龄是:' || age);     
     end if;
exception 
      when ex_custom_invaild_age then
        dbms_output.put_line('非法的年龄');
end;

引发应用程序异常

--raise_application_error(异常编号,说明);
declare        
       age int;
begin
     age := &请输入年龄;
     if (age < 0) then
        raise_application_error(-20500, '年龄不能为负数');
     else
        dbms_output.put_line('年龄是:' || age);
     end if;
end;

非预定义异常

declare     
     ex_custom_error exception;
     pragma exception_init(ex_custom_error, -1); `把一个编号和一个自定义异常关联,
     `相当于把-1编号的异常命名为ex_custom_error,这样就可以捕获这种异常
begin       
     insert into dept values(10, 'aaa', 'bbb');
     exception       
       when ex_custom_error then
       dbms_output.put_line('部门编号已经存在');
end;

异常处理

declare
  vSal emp.sal%type;
begin
  select sal into vSal from emp;
  exception
    when too_many_rows then
      dbms_output.put_line('多条数据');
    when others then
      dbms_output.put_line('Error');
end;
 
declare
  vSal emp.sal%type;
begin
  select sal into vSal from emp where empno = 1;
  exception
    when no_data_found then
      dbms_output.put_line('没有数据');
    when others then
      dbms_output.put_line('Error');
end;

异常日志处理

create table errorLog (
       id number primary key,
       errCode number,
       errMsg varchar2(1024),
       errDate date
);

创建序列,从1开始,每次加1

create sequence seq_errorLog_id start with 1 increment by 1;
 
declare
       vDeptno dept.deptno%type := 10;
       vErrCode number;
       vErrMsg varchar2(1024);
begin
  delete from dept where deptno = vDeptno;
  commit;
  exception
    when others then
      rollback;
      vErrCode := SQLCODE;
      vErrMsg := SQLERRM;
      insert into errorLog values(seq_errorLog_id.nextval, vErrCode, vErrMsg, sysdate);
      commit;
end;
 
select * from errorLog;
最后修改:2022 年 01 月 18 日
如果觉得我的文章对你有用,请随意赞赏