Oracle中的异常处理

Oracle中的异常处理:
1.Oracle内置的已命名的异常,如no_data_found。


例:
create or replace procedure p_test_exception(p_userid in varchar2,p_empno in varchar2)
as 
v_ename varchar2(32);
v_error_text varchar2(500);
begin
begin
select ename into v_ename from emp where empno = p_empno;
exception
when no_data_found then
v_error_text := '没有empno为' || p_empno || '的员工';
t_log_package.log_error(p_userid,'',v_error_text);
return;
end;
update emp set salary = salary + 1000 where empno = p_empno;
commit;
end p_test_custom_exception;


2.用户自定义异常:
2.1在声明部分用custom_exception_name exception;声明一个自定义异常
2.2根据程序逻辑抛出异常:raise exception;
2.3在异常处理部分处理异常:
when custom_exception_name then 
这种异常是我们根据业务逻辑抛出的异常。


例:
create or replace procedure p_test_custom_exception(p_userid in varchar2)
as 
user_exception exception;
v_count number:= 0;
v_error_text varchar2(500);
begin
select count(*) into v_count from student s where s.class is null;
if v_count = 0 then
v_error_text := 'There are ' || v_count || ' student(s) has/have not been assigned classes.';
raise user_exception;
end if;
exception
when user_exception then
p_package_error.log_error(p_userid,'p_test_custom_exception',v_error_text);
end p_test_custom_exception;


3.用户自定义异常:
3.1.在声明部分用custom_exception_name exception;声明一个自定义异常;
3.2在声明部分用 PRAGMA EXCEPTION_INIT(custom_exception_name,oracle_error_code);来初始化异常。
3.3在异常处理部分处理异常。
这种类型适合处理Oracle的一些未命名的异常,如表被锁。
ps:我们通常可能直接使用的when others来处理。


例:
create or replace procedure p_test_custom_exception(p_userid in varchar2,p_empno in varchar2,p_salary in number)
as 
lock_wait exception;
--ORA-00054: 资源正忙,要求指定 NOWAIT
PRAGMA EXCEPTION_INIT(lock_wait,-54);
v_count number:= 0;
v_error_text varchar2(500);
begin
update emp e set e.salary = e.salary + p_salary where e.emp_no = p_empno;
commit;
exception
when lock_wait then
rollback;
 v_error_text := '表被锁,请稍候再试!';
p_package_error.log_error(p_userid,'p_test_custom_exception',v_error_text);
end p_test_custom_exception;


ps:以上例子仅是举例,可能不太合理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值