mysql - 准备好的语句失败,但语句可以通过多个 WHERE 参数自行运行

标签 mysql prepared-statement where-clause

我正在编写一个程序,当我尝试使用准备好的语句使其动态化时,该程序失败了。准备好的字符串中包含的语句确实可以在准备好的语法之外自行运行。

其他信息:

  • 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/

相关文章:

zend-framework - Zend框架:重用从Zend_Db_Select::getPart()返回的WHERE子句

mysql - 从数据库中删除除了那个过滤器

php - 调用非对象上的成员函数bind_param()

sql - 就用途而言,准备好的语句和 SQL 或 PL/pgSQL 函数之间有什么区别?

php - linux 在 mysqli_stmt_close 后失去值(value)

asp.net - LINQ:如何重写查询中的 WHERE 子句?

mysql - 无法连接到 MySQL - 主机不允许

MySQL 使用 ON 从多个表中删除不起作用

PHP变量正确回显但未进入数据库

postgresql - Postgres - 加入更新给出了错误的结果