Почему эта MySQL хранимая процедура не выполняет свой обработчик выхода? - PullRequest
0 голосов
/ 09 февраля 2020

Я прочитал документацию по обработчикам выходов и нашел полезные идеи кода в соответствующих вопросах SO здесь и здесь среди других мест.

Тем не менее, вызов хранимой процедуры, представленной ниже, кажется, завершает OK и возвращает значение TRUE для параметра success. когда я знаю, что он определенно не завершает OK, не в последнюю очередь потому, что в теле была синтаксическая ошибка SQL (это относилось к несуществующему полю).

Поэтому обработчик выхода должен был запустить в и вернул FALSE для параметра success.

Может кто-нибудь помочь мне понять, почему неудачная транзакция не возвращает правильное значение для параметра? (Я подозреваю, что это как-то связано с тем, где я установил success в true)

Фактический SQL внутри транзакции не важен для этого вопроса, поэтому я его не показывал. Просто предположите, что он может или не может успешно завершить транзакцию. Это успех или неудача этой транзакции, которую я хочу обнаружить с помощью параметра

DELIMITER $$
CREATE PROCEDURE do_thing (OUT success BOOLEAN)     

DETERMINISTIC
 BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET success := FALSE; ROLLBACK; END;   # rollback on any error
DECLARE EXIT HANDLER FOR SQLWARNING  BEGIN SET success := FALSE; ROLLBACK; END;     # rollback on any warning

START TRANSACTION;

       < SQL that might cause an error >
       < in my case it was referring to a field that didn't exist>

COMMIT;
SET success := TRUE;  
END$$
DELIMITER ;

1 Ответ

0 голосов
/ 09 февраля 2020

SEE DBFIDDLE

Первая часть является копией вашего кода, выдает ошибку ....

Вторая часть исправлена, обе DECLARE EXIT перемещаются внутри блока.

Третья часть - это пример, где @success будет установлен на false.

...