RESIGNAL Requires an Active Handler
All forms of RESIGNAL require that a handler be active when it executes. If no handler is active, RESIGNAL is illegal and a resignal when handler not active error occurs. For example:
mysql>CREATE PROCEDURE p () RESIGNAL;Query OK, 0 rows affected (0.00 sec) mysql>CALL p();ERROR 1739 (0K000): RESIGNAL when handler not active
Here is a more difficult example:
delimiter // CREATE FUNCTION f () RETURNS INT BEGIN RESIGNAL; RETURN 5; END// CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @a=f(); SIGNAL SQLSTATE '55555'; END// delimiter ; CALL p();
At the time the RESIGNAL executes, there is a handler, even though the RESIGNAL is not defined inside the handler.
A statement such as the one following may appear bizarre because RESIGNAL apparently is not in a handler:
CREATE TRIGGER t_bi BEFORE INSERT ON t FOR EACH ROW RESIGNAL;
But it does not matter. RESIGNAL does not have to be technically "in" (that is, contained in), a handler declaration. The requirement is that a handler must be active.