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;