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:以上例子仅是举例,可能不太合理。
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:以上例子仅是举例,可能不太合理。