如何将MySQL异常传播到Java程序?

时间:2009-09-17 16:53:18

标签: java sql mysql jdbc

我有一个调用MySQL存储过程的java程序,当它获得SQLEXCEPTION时会回滚。当我将rollback(退出处理程序)添加到存储过程时,Java程序停止获取SQL异常。

如何确保将SQL异常和MySQL错误消息传播回Java程序?

这是我的商店程序:

DELIMITER $$

DROP PROCEDURE IF EXISTS up_OMS_insertParticipantOmsOrderOwner $$
CREATE PROCEDURE up_OMS_insertParticipantOmsOrderOwner(
                 IN PID int,
                 IN OwnerName varchar(50),
                 IN DisplayName varchar(50),
                 IN Enabled tinyint(1))

BEGIN
declare exit handler for SQLException
  BEGIN
    rollback;
  END;
start transaction;

if (DisplayName<>'') then
  insert OmsOrderOwner (ParticipantID, OmsOrderOwnerName, DisplayName, Enabled)
  value (PID, OwnerName,DisplayName, Enabled);
else
  insert OmsOrderOwner(ParticipantID, OmsOrderOwnerName, DisplayName, Enabled)
  value (PID, OwnerName,null, Enabled);
end if;

set @OwnerID := @@identity;

insert UserOmsOrderOwnerSubscription (UserID, ParticipantID, OmsOrderOwnerID, Enabled)
select
  userOrderSub.UserId, PID, @OwnerID, 1
from
  Users u,
  UserOmsOrderSubscription userOrderSub
where
  userOrderSub.UserID = u.UserID and
  u.ParticipantID = PID;

commit;

END $$

DELIMITER ;

2 个答案:

答案 0 :(得分:2)

在退出处理程序中使用RESIGNAL语句重新抛出错误。

那就是说,真的你需要在你的存储过程中显式开始/提交/回滚事务吗? JDBC调用将(应该)在自己的事务中完成,你可以依靠它来处理错误/回滚并为自己省去一些麻烦吗?

答案 1 :(得分:0)

由于您在STP中处理了错误,因此它不再是例外。它应该只是您通话的正常返回状态。你应该从退出处理程序返回一些东西,比如

declare exit handler for SQLException
  BEGIN
    rollback;
    select 1;
  END;
start transaction;

1或其他什么是回滚的错误代码。

如果你仍然认为这是一个例外,你可以在MySQL 6.0中使用resignal。在早期版本中,您可以通过调用这样的非存在函数来触发错误,

 call ROLLED_BACK_EXCEPTION();
相关问题