Oracle--异常处理
Oracle 的异常分类:1. 预编译异常:
Oracle 可以直接捕获异常, 并且给这个异常取了异常
/*
异常名
NO_DATA_FOUND 语句⽆返回数据 V
TOO_MANY_ROWS 在执⾏select into 语句时返回多⾏时出现 VLOGIN_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;