Cómo generar un error dentro de una función MySQL

Creé una función MySQL y me gustaría generar un error si los valores pasados ​​para los parámetros no son válidos. ¿Cuáles son mis opciones para generar un error dentro de una función MySQL?

MySQL 5.5 introduce señales, que son similares a las excepciones en otros idiomas:

http://dev.mysql.com/doc/refman/5.5/en/signal.html

Por ejemplo, en el cliente de línea de comandos mysql :

 mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error'; ERROR 1644 (45000): Custom error 

En realidad es una combinación de las tres respuestas. Llama a un procedimiento inexistente para generar el error y luego declara un controlador de salida que detecta el error que generó. Aquí hay un ejemplo, usando SQLSTATE 42000 (el procedimiento no existe) para lanzar un error antes de la eliminación si la fila que se va a eliminar tiene un conjunto de identificación de clave externa:

 DROP PROCEDURE IF EXISTS decount_test; DELIMITER // CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint ) DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '42000' SELECT 'Invoiced barcodes may not have accounting removed.'; IF (SELECT invoice_id FROM accounted_barcodes WHERE id = p_id ) THEN CALL raise_error; END IF; DELETE FROM accounted_barcodes WHERE id = p_id; END // DELIMITER ; 

Salida:

 call decount_test(123456); +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+ 

¿Por qué no simplemente almacenar un VARCHAR en una variable INTEGER declarada?

 DELIMITER $$ DROP FUNCTION IF EXISTS `raise_error` $$ CREATE FUNCTION `raise_error`(MESSAGE VARCHAR(255)) RETURNS INTEGER DETERMINISTIC BEGIN DECLARE ERROR INTEGER; set ERROR := MESSAGE; RETURN 0; END $$ DELIMITER ; -- set @foo := raise_error('something failed'); -- or within a query 

Mensaje de error es:

Valor entero incorrecto: ‘algo falló’ para la columna ‘ERROR’ en la fila 1

No es perfecto, pero da un mensaje bastante descriptivo y no tiene que escribir ninguna extensión DLL.

En MySQL 5 puede generar un error llamando a un procedimiento almacenado que no existe (CALL raise_error) o pasando un valor no válido a una consulta (como nulo a un campo cerrado NOT NULL). Aquí hay una publicación interesante de Roland Bouman sobre cómo generar errores dentro de una función de MySQL:

http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html

También puede llamar a una función existente con un número inválido de argumentos.

Debe definir manejadores de excepciones. Eche un vistazo a http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html