Recently I got this question twice. Although SIGNAL was
implemented in version 6.0 (which is partially mysql-trunk now) this version is not stable yet,
so users still need to use workaround.
Here it is. Create 2 procedures as following:
DROP PROCEDURE IF EXISTS raise_application_error;
DROP PROCEDURE IF EXISTS get_last_custom_error;
DROP TABLE IF EXISTS RAISE_ERROR;
DELIMITER $$
CREATE PROCEDURE raise_application_error(IN CODE INTEGER, IN
MESSAGE VARCHAR(255)) SQL SECURITY INVOKER DETERMINISTIC
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS RAISE_ERROR(F1 INT
NOT NULL);
SELECT CODE, MESSAGE INTO @error_code,
@error_message;
INSERT INTO RAISE_ERROR VALUES(NULL);
…