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.