我有3个查询:
1. INSERT, 2. UPDATE and 3. DELETE
我想知道是否存在以至于我可以直接检查(即,如果查询执行成功与否则不运行另一个检查查询)?如果它没有(即返回一些错误/异常),那么我想将该错误/异常保存到某些变量中?
例如,以下是我的查询:
INSERT
查询:
INSERT INTO `users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);
UPDATE
查询:
UPDATE `test_db2`.`users`
SET name = NEW.name,
age = NEW.age
WHERE id = NEW.id;
DELETE
查询:
DELETE FROM `test_db2`.`users`
WHERE id = OLD.id;
感谢。
这里是使用Handler的简单INSERT触发器(我试过):
DELIMITER //
-- TRIGGER FOR INSERT
DROP TRIGGER IF EXISTS `test_db1_users_ai`;
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW
BEGIN
-- Perform the insert
INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);
-- Handler if this ^ above INSERT fails.
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
--SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
INSERT INTO `test_db1`.`errors` (error_code, error_message) VALUES (@errno, @text);
--SELECT @full_error;
END;
END; //
答案 0 :(得分:1)
在MySQL中,您可以声明可以捕获各种错误和警告的error / warning handlers。如果将处理程序与get diagnostics command组合在一起,那么您甚至可以捕获通用处理程序中的确切错误/警告。
我在Improve your Stored Procedure Error Handling with GET DIAGNOSTICS上发现了以下博客文章,总结了如何在MySQL中存储的程序中捕获错误消息:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
SELECT @full_error;
END;
显然,如果需要,您可以在表中记录@full_error中的错误。如果没有错误处理程序启动,则sql语句成功运行。
使用插入和更新,您还可以使用row_count()函数来确定受影响的记录数。如果此数字为0,则可能表示存在错误。
答案 1 :(得分:0)
请参阅此处:https://stackoverflow.com/a/37853801/5228251
在下面查看(即,从上面的来源复制):
-- TRIGGER FOR INSERT
DROP TRIGGER IF EXISTS `test_db1_users_ai`;
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW
BEGIN
-- Declare variables to hold diagnostics area information
DECLARE errorCode CHAR(5) DEFAULT '00000';
DECLARE errorMessage TEXT DEFAULT '';
-- Declare exception handler for failed insert
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
errorCode = RETURNED_SQLSTATE, errorMessage = MESSAGE_TEXT;
END;
-- Perform the insert
INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);
-- Check whether the insert was successful
IF errorCode != '00000' THEN
INSERT INTO `errors` (code, message, query_type, record_id, on_db, on_table) VALUES (errorCode, errorMessage, 'insert', NEW.id, 'test_db2', 'users');
END IF;
END; //