Oracle笔记 七、PL/SQL 异常处理

--异常处理
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;
posted on 2011-05-03 15:30  hoojo  阅读(2367)  评论(0编辑  收藏  举报