Как распространить исключения MySQL в программу Java? - PullRequest
1 голос
/ 17 сентября 2009

У меня есть Java-программа, которая вызывает хранимую процедуру MySQL, которая откатывается при получении SQLEXCEPTION. Когда я добавил откат (обработчик выхода) к хранимой процедуре, 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 ]

2 голосов
/ 17 сентября 2009

Используйте оператор RESIGNAL в обработчике выхода, чтобы сбросить ошибку.

Тем не менее, вам ДЕЙСТВИТЕЛЬНО необходимо явно начать транзакцию / принятие / откат транзакции в вашей хранимой процедуре? В любом случае вызов JDBC будет (должен) выполняться внутри собственной транзакции. Можете ли вы вместо этого положиться на него, чтобы обработать ошибку / откат и, возможно, избавить себя от некоторых проблем?

0 голосов
/ 17 сентября 2009

Поскольку вы обработали ошибку в STP, она больше не является исключением. Это должен быть просто нормальный статус возврата вашего звонка. Вы должны вернуть что-то из обработчика выхода, например

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

1 или любой другой код ошибки для отката.

Если вы все еще думаете, что это исключение, вы можете использовать resignal в MySQL 6.0. В более ранней версии вы можете просто вызвать ошибку, вызвав такую ​​несуществующую функцию, как

 call ROLLED_BACK_EXCEPTION();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...