预准备语句失败,但语句使用多个 WHERE 参数自行工作



我正在编写一个过程,一旦我尝试使用准备好的语句使其动态化,它就会失败。准备的字符串中包含的语句确实在准备好的语法之外自行工作。

附加信息:

  • period_start() 和 period_end() 函数返回已格式化并确认工作的日期
  • 当任何 WHERE 子句参数仅与自身隔离时,即使在预准备语句字符串中也是如此,该过程将运行
  • 传递给 prepare stmt 的字符串可以在准备之外自行运行

目标:获取预准备语句,使其在 WHERE 子句中使用多个 AND 声明执行。

当前代码:

DROP PROCEDURE IF EXISTS count_sessions_in_period;
DELIMITER //
CREATE PROCEDURE `count_sessions_in_period` (IN period INT)
BEGIN
SET @prepare_stmt = CONCAT("INSERT INTO 2017_p",period," (total_sessions,user_id,employee_name,manager_id)
SELECT @total_in_period := COUNT(DISTINCT m_s.class_id), m_u.uid, m_am.employee_name, m_u.manager_id
FROM m.sessions m_s
INNER JOIN m.assigned_employee m_am
ON m_s.sid = m_am.sid
INNER JOIN m.users m_u
ON m_am.employee_email = m_u.email
WHERE m_s.type = 'SESSIONS' AND m_s.date BETWEEN period_start(",period,") AND period_end(",period,") AND attended_status NOT LIKE '%cancelled%' AND attended_status NOT LIKE '%alert%'
GROUP BY m_u.uid
ON DUPLICATE KEY UPDATE total_sessions=@total_in_period");
PREPARE stmt FROM @prepare_stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
#######################################################################
CALL count_sessions_in_period(1);

收到的错误是,"您的 SQL 语法有错误;检查与您的MySQL服务器版本相对应的手册,了解第8行"%alert%"附近的正确语法

请记住,我已经尝试转义所有引号并使它们全部为单引号或双引号。

这个问题从未得到回答,但最终我发现,在 MYSQL 中使用动态预准备语句时,SELECT 返回结果的时间量对 INSERT 的成功产生了负面影响。

为了解决这个问题,创建一个临时的 SELECT 结果表并执行您的插入...从临时表中的结果中选择。该问题源于插入的异步...选择。

最新更新