准备好的语句失败但是语句在多个WHERE参数上自行运行

时间:2017-07-05 16:28:33

标签: mysql prepared-statement where-clause

我正在编写一个程序,一旦我尝试使用预处理语句使其动态化,就会失败。包含在准备好的字符串中的语句在准备好的语法之外就可以自己运行。

其他信息:

  • 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%'附近找到正确的语法“

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

1 个答案:

答案 0 :(得分:0)

这一点从未得到解答,但最后我发现在MYSQL中使用动态预处理语句时,SELECT返回结果的时间对INSERT的成功产生了负面影响。

为了解决此问题,请创建SELECT结果的临时表,并从临时表中的结果执行INSERT ... SELECT。问题源于INSERT ... SELECT的异步。