Oracle--异常处理

Oracle 的异常分类:

1. 预编译异常: 

    Oracle 可以直接捕获异常, 并且给这个异常取了异常

/*
异常名
NO_DATA_FOUND           语句无返回数据        V
TOO_MANY_ROWS           在执行select into 语句时返回多行时出现   V
LOGIN_DENIED            使用无效的用户名和口令登录Oracle
INVALID_NUMBER          试图将一个非有效的字符串转换成数字  
DUP_VAL_ON_INDEX        重复的值存储在使用唯一索引的列中( 违反主键约束,唯一约束抛的异常)
ACCESS_INTO_NULL        试图给一个没有初始化的对象赋值
ZERO_DIVIDE             除以0
VALUE_ERROR             算术或转换错误
TIMEOUT_ON_RESOURCE     在等待资源时发生超时
*/

例:

--预编译的异常, oracle捕获到这个异常,  编码的时候,只需要进行异常处理
declare 
   v_empno emp.empno%type  :='&请输入员工编号'; 
   v_name  emp.ename%type;

begin
   select ename  into v_name from emp where empno = v_empno;
   dbms_output.put_line(v_name);
   exception    --异常处理
     -- when 异常名 then  
     --   处理异常的代码
     when NO_DATA_FOUND then
        dbms_output.put_line('查无此人!!');    
     when TOO_MANY_ROWS then
       dbms_output.put_line('数据台多!!!');   
     when others then
       dbms_output.put_line('未知错误');   
end;

2.非预定义异常:

    Oracle 会捕获这个异常(这个异常有一个异常错误代码), 但是Oracle 没有这个异常取名

--SQL 错误: ORA-02291: 违反完整约束条件
--  Oracle 异常:  错误代码: -2291     异常名,  异常信息
--处理方案:  
--  给这个异常绑定一个名字(异常变量名)     
-- 步骤:  变量名 数据类型
--    1. 声明一个异常类型的变量      异常变量名  exception;
--    2. 把异常错误代码与异常变量名绑定在一起,  Oracle 抛出异常代码:-2291,  找到自定义的异常变量名
--           给指定错误代码的异常取一个名字   PRAGMA  EXCEPTION_INIT(自定义异常名,异常代码);
--    3. 在exception中,when  异常变量名 then 处理异常

例:

declare
    --1.声明一个异常类型的变量
    FK_EXCEPTION  exception;
    --2.把异常变量绑定一个错误代码
    PRAGMA  EXCEPTION_INIT(FK_EXCEPTION,-2291);
begin
    insert into  emp_back3 values(1002,'JACK','SALESMAN','7902','1990-01-01',1500,300,50);
    --3处理异常
     exception
        when FK_EXCEPTION then
          dbms_output.put_line('添加失败,没有该部门!!');
        when others  then
          dbms_output.put_line('未知错误');
end;

3.自定义异常:

    Oracle不会捕获这个异常(把这个当成一个错误, 逻辑错误), 也没有异常名

--   人为的创建一个异常, 根据需求来
/*
   1.申明一个异常,  异常名  exception;
   2.在指定的地方抛出这个异常   RAISE  异常名; 人为的抛出这个异常,类似  throw  异常对象;
   3.捕获这个异常,然后进行处理     在exception中,when  异常变量名 then 处理异常
*/

例:

--自定义一个 奖金为null的异常
declare
    --1. 声明一个异常
    my_exception  exception;
    v_comm emp.comm%type;
    v_empno emp.empno%type := '&请输入员工编号';
begin
  select  comm into v_comm from emp where empno = v_empno;
  if v_comm is null then
    --2.抛出异常
    RAISE my_exception;   --抛出异常
  else
     dbms_output.put_line('哥们你的奖金:'||v_comm);
  end  if;
  --3.处理异常
  exception 
    when my_exception then
       dbms_output.put_line('奖金为空,赶快去找老板要!!');
end;
原文地址:https://www.cnblogs.com/64Byte/p/12709383.html