gpt4 book ai didi

mysql - 为什么 MySQL 程序在遇到错误时停止执行?我该如何让它继续下去?

转载 作者:行者123 更新时间:2023-11-29 23:25:37 25 4
gpt4 key购买 nike

我有一个执行许多查询的存储过程。我想做的是将任何错误“如果发生”记录到我创建的新表中,然后继续下一个查询。

这是该过程的一部分

DELIMITER $$

CREATE DEFINER=`root`@`10.%` PROCEDURE `prod_create_new_tasks`()
MAIN:
BEGIN


SET @trys = 0;

loop_label: LOOP

SET @trys := @trys+1, @p1 = '', @p2 = '';

DROP TEMPORARY TABLE IF EXISTS su;
CREATE TEMPORARY TABLE su (KEY(user_id)) ENGINE=MEMORY AS
SELECT user_id, fullname, current_team_id, status
FROM mydb.view_users;

SET @total_errors = @@error_count;

GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;


IF(@total_errors > 0 OR @trys > 10) THEN
-- log error
INSERT INTO mydb.error_logs(error_no, error_text, procedure_name, stage)
VALUES(@p1, @p2, current_procedure_name, 'loop_label' );

-- if there are too many tries to create the temporary table and it keeps failing Quit!!
IF( @trys > 10) THEN
LEAVE MAIN;
ELSE
-- sleep for 10 seconds and go back to create the table again
SELECT SLEEP(10);
ITERATE loop_label;
END IF;

END IF;
LEAVE loop_label;
END LOOP;

-- set MySQL Safe mode ON on update
SET SQL_SAFE_UPDATES = 1;
END

按照那里的逻辑,代码应该尝试创建一个临时表。如果尝试创建临时表时出现任何错误,GET DIAGNOSTICS 应捕获错误并将其存储到 error_logs 表中。 10 秒后,应再次尝试创建表。

似乎正在发生的事情是,一旦第一次尝试创建表失败,它就会停止并将错误写入屏幕。没有错误记录到 error_logs 表中,也没有进行其他尝试。

似乎需要更改季节的变量,以便即使遇到错误,程序也能继续。

我的问题是如何将错误“如果有”记录到表中并允许循环跳转到下一次运行而不停止?

请注意,我尝试将 view_users 表更改为故意不存在的表,这样我就可以将错误“表不存在”记录到表中,但这不起作用。

最佳答案

我终于找到了解决办法。我想发布答案以帮助遇到相同问题的任何人。

解决办法是DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

即使出现错误,Continue Handler 也将允许代码运行。从那里我设置了 sqlstate 和 errorno,然后存储它们并继续。

这是我的最终代码。

DELIMITER $$

CREATE DEFINER=`root`@`10.%` PROCEDURE `prod_create_new_tasksddd`()
MAIN:
BEGIN

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@err_sqlstate = RETURNED_SQLSTATE,
@err_message = MESSAGE_TEXT,
@err_num = MYSQL_ERRNO;

SET @hasError = TRUE;
END;

SET @current_procedure_name = 'taskddd';
SET @trys = 0;
SET @hasError = FALSE;

loop_label: LOOP

SET @trys := @trys+1;


DROP TEMPORARY TABLE IF EXISTS su;
SET @hasError = FALSE;

-- trigger error 1146
CREATE TEMPORARY TABLE su LIKE t2;


IF(@hasError OR @trys > 10) THEN

IF @trys > 10 THEN
SET @msg = 'Gave Up!';
ELSE
SET @msg = CONCAT('Trying Again ', @trys);
END IF;

INSERT INTO mydb.error_logs(error_no, error_sqlstate, error_text, procedure_name, stage, trys, current_actions) VALUES(@err_num, @err_sqlstate, @err_message, @current_procedure_name, 'loop_label', @trys , @msg);

-- if there are too many tries to create the temporary table and it keeps failing Quit!!
IF( @trys > 10) THEN
LEAVE MAIN;
ELSE
-- sleep for 2 seconds and go back to create the table again
SET @err_sqlstate = '', @err_message = '', @err_num = '', @msg = NULL;
SET @hasError = FALSE;
SELECT SLEEP(2);
ITERATE loop_label;
END IF;

END IF;

LEAVE loop_label;
END LOOP;

END

关于mysql - 为什么 MySQL 程序在遇到错误时停止执行?我该如何让它继续下去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26999010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com