我正在编写一个程序,当我尝试使用准备好的语句使其动态化时,该程序失败了。准备好的字符串中包含的语句确实可以在准备好的语法之外自行运行。
其他信息:
- period_start() 和 period_end() 函数返回一个经过格式化并确认有效的日期
- 当任何 WHERE 子句参数仅与其自身隔离时,即使在准备好的语句字符串中,该过程也会运行
- 传递给准备 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 结果的临时表,并从临时表中的结果执行 INSERT...SELECT。该问题源于 INSERT...SELECT 的异步。
关于mysql - 准备好的语句失败,但语句可以通过多个 WHERE 参数自行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44931555/