如何在MySQL函数中引发错误
我创建了一个MySQL函数,如果传递给参数的值无效,则想引发一个错误。 在MySQL函数中引发错误我有哪些选择?
6个解决方案
69 votes
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
Austin Hyde answered 2019-10-07T13:38:26Z
25 votes
它实际上是所有三个答案的组合。 您调用一个不存在的过程来引发该错误,然后声明一个退出处理程序来捕获您生成的错误。 这是一个示例,如果要删除的行设置了外键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. |
+----------------------------------------------------+
Ryan M answered 2019-10-07T13:38:54Z
7 votes
为什么不只在声明的INTEGER变量中存储VARCHAR?
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
错误消息是:
不正确的整数值:行“ ERROR”的列“ something failed” 1个
它不是完美的,但是它给出了一个漂亮的描述性消息,您不必编写任何扩展DLL。
answered 2019-10-07T13:39:42Z
5 votes
在MySQL 5中,您可能会通过调用不存在的存储过程(CALL raise_error)或将无效值传递给查询(例如null到NOT NULL禁忌字段)来引发错误。 这是Roland Bouman撰写的有趣的帖子,内容涉及从MySQL函数中引发错误:
[http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html]
Patrick de Kleijn answered 2019-10-07T13:40:14Z
2 votes
您还可以使用无效数量的参数调用现有函数。
answered 2019-10-07T13:40:39Z
0 votes
您必须定义异常处理程序。 看看[http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html]
Jorge Niedbalski R. answered 2019-10-07T13:41:09Z