У меня есть хранимая процедура, в которой я хотел бы откат на случай, если что-то пойдет не так. Для этого я использую EXIT HANDLER следующим образом:
DECLARE EXIT HANDLER FOR sqlexception begin ROLLBACK; end;
Но таким образом, когда я вызываю эту хранимую процедуру, в случае каких-либо ошибок, хранимая процедура будет успешной, и я не знаю, в чем была проблема. Я хочу, чтобы клиент (php) регистрировал ошибку, чтобы устранить ее. Поэтому я изменяю таким образом:
DECLARE EXIT HANDLER FOR sqlexception begin get diagnostics condition 1 @p1 = MESSAGE_TEXT; ROLLBACK; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1; end;
Таким образом, теперь откат хранимой процедуры и выброс исключений, которые обработчик перехватил. Это круто, но иногда MESSAGE_TEXT составляет более 128 символов, и в таких случаях я получаю:
Код ошибки: 1648. Слишком длинные данные для условия «MESSAGE_TEXT»
Конечно, это решение неприемлемо:
DECLARE EXIT HANDLER FOR sqlexception begin get diagnostics condition 1 @p1 = MESSAGE_TEXT; ROLLBACK; SET @p1=SUBSTRING(@p1,1,128); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1; end;
Есть ли способ перехватить какое-либо исключение, откат и затем выбросить то же исключение клиенту? Большое спасибо за вашу помощь