如何在MySQL函数中引发错误
我已经创build了一个MySQL函数,并且如果parameter passing的值是无效的,就会引发一个错误。 我在MySQL函数中引发错误的选项是什么?
MySQL 5.5引入了与其他语言中的例外类似的信号:
http://dev.mysql.com/doc/refman/5.5/en/signal.html
例如,在mysql
命令行客户端中:
mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error'; ERROR 1644 (45000): Custom error
这实际上是所有三个答案的组合。 您调用一个不存在的过程来引发错误,然后声明一个退出处理程序来捕获您生成的错误。 下面是一个例子,如果要删除的行有一个外键ID集,使用SQLSTATE 42000(过程不存在)在删除之前抛出一个错误:
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 ;
输出:
call decount_test(123456); +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+
为什么不把VARCHAR
存储在已声明的INTEGER
variables中呢?
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
错误信息是:
不正确的整数值:第1行的'ERROR'列出现'something failed'
这不是完美的,但它提供了一个很好的描述性的消息,你不必写任何扩展DLL。
在MySQL 5中,您可能会通过调用不存在的存储过程(CALL raise_error)或将无效值传递给查询(如NOT NULL约束字段的空值)来引发错误。 以下是Roland Bouman在MySQL函数中引发错误的一个有趣的post:
http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html
您也可以使用无效的参数来调用现有的函数。
你必须定义exception处理程序。 看看http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html