[探讨]论java调用存储过程的异常处理
下面是一个颇有争议的论题:
我们要探讨的是在java(jsp)调用Oracle数据库的存储过程时,如果数据库操作出现异常,对于该异常应该如何处理的问题.要求异常情况提示在客户端.
用一个最简单的例子来说明
有一个表test,拥有两个字段id,name,其中id为主键
现在向test表插入数据(1,'aaa'),(2,'bbb'),(3,'ccc')自然没有问题
如果再插入记录(1,'ddd')就会发生主键不唯一的异常,我们讨论的就是如何处理该异常.
如果插入记录的操作是用存储过程实现的,则至少存在以下两个典型的写法:
写法1:
create or replace procedure cp_test1
( i_id int,
i_name varchar2,
o_retvalue int
)
is
t_errorcode int;
begin
t_errorcode:=0;
begin
insert into test(id,name) values(i_id,i_name);
exception
when others then
t_errorcode:=sqlcode;
end;
o_retvalue:=t_errorcode;
end cp_test1;
写法2:
create or replace procedure cp_test2
( i_id int,
i_name varchar2
)
is
begin
insert into test(id,name) values(i_id,i_name);
end cp_test2;
写法1与写法2的区别在于写法1用了一个output输出值o_retvalue,而写法2没有
现在假设jsp均是通过javabean调用存储过程,执行javabean的executeProc方法
则有:
写法1将数据库的错误代码通过sqlcode得到了,所以在页面中只需检测executeProc的
返回值是否为0,非零即表示数据库出错,提示出错信息即可,这种方法简化了jsp页面,但增加了存储过程的编写工作量.
写法2将数据库的异常依赖于异常的传播机制,希望将数据库异常由运行时抛出,然后在javabean和jsp中捕获它,再实现异常信息的再现.这种方法简化了数据库存储过程的编写,也充分利用的java语言的异常处理机制.
问题来了:
究竟哪一种写法合理些?或者说使用更普遍些?
如果是写法2,那么javaben和jsp对该异常应该如何处理?
如何抛出?如何捕获?代码应怎样写才合理?
请大家不吝发言,谢谢!