2009-09-17 7 views
1

У меня есть Java-программа, которая вызывает хранимую процедуру MySQL, которая откатывается, когда она получает SQLEXCEPTION. Когда я добавил откат (обработчик выхода) в хранимую процедуру, программа Java перестала получать исключение SQL.Как распространять исключения MySQL в программе Java?

Как я могу убедиться, что сообщение об ошибке 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

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

Что вы сказали REALLY Нужно явно начать транзакцию/совершить транзакцию в вашей хранимой процедуре? В любом случае, вызов JDBC будет (должен быть) выполнен в рамках собственной транзакции, можете ли вы вместо этого полагаться на него, чтобы справиться с ошибкой/откатом и сэкономить некоторые неприятности, возможно?

+0

Да, мы можем переместить фиксацию и откат в нашем Java-коде. к сожалению, мы не сможем сделать это в ближайшей перспективе. Также, к сожалению, мы находимся на версии 5.0x mysql, поэтому resignal не работает. Я могу написать signalFunct самостоятельно, но я не получу сообщение об ошибке mysql. – richs

0

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

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

1 или что-то еще будет кодом ошибки для отката.

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

call ROLLED_BACK_EXCEPTION(); 
+0

Resignal работает от 5.4, а не 6.0. И создание ложной ошибки (путем вызова несуществующей функции) вместо того, чтобы возвращать фактический, является менее идеальным по многим причинам. – ChssPly76

Смежные вопросы