funciones - Cómo generar un error dentro de una función MySQL
funciones en mysql ejercicios (6)
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?
¿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.
Debe definir manejadores de excepciones. Eche un vistazo a http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
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 la generación de errores desde una función MySQL:
http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html
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. |
+----------------------------------------------------+
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
También puede llamar a una función existente con un número inválido de argumentos.