【问题标题】:LIMIT not working with user defined parameters in Stored Procedure in MySQL 8.0LIMIT 在 MySQL 8.0 的存储过程中不能使用用户定义的参数
【发布时间】:2019-04-04 13:33:46
【问题描述】:

当我尝试使用 存储过程 从用户详细信息表中获取用户详细信息时,LIMIT 语句不适用于 startIndex 和 endIndex 参数。下面的代码产生 MySQL 错误 2013,即Lost connection to MySQL server during query

这只会在 MySQL 8.0 版中发生,并且在 5.7 等以下版本中正常工作。当我从过程中删除 LIMIT 条件时也可以工作。

之后,我尝试使用 PREPARE STMT 这个查询由于多个 CONCAT 使用而产生错误。

CREATE PROCEDURE return_something(IN markFilter VARCHAR(100), IN nameFilter VARCHAR(100), IN startIndex INT, IN endIndex INT)
BEGIN
CREATE TEMPORARY TABLE temp_user_details
SELECT id, name, address FROM user_details  
WHERE (CASE WHEN markFilter!='' THEN FIND_IN_SET(mark,markFilter) ELSE mark IS NOT NULL END) 
AND (CASE WHEN nameFilter !='' THEN name LIKE CONCAT('%',nameFilter,'%') ELSE id IS NOT NULL END)
LIMIT startIndex, endIndex;

SELECT id, name FROM temp_user_details;
DROP TEMPORARY TABLE return_something;
END
call return_something('','', 0, 100);

【问题讨论】:

  • 您是否正确转录了此内容 - 例如,当您的临时表是 temp_user_details 时,为什么要删除 return _something?标记来自哪里?

标签: mysql stored-procedures mysql-workbench mysql-error-2013


【解决方案1】:

最可能的原因是超时。 LIMIT 子句可能会使查询变慢,因此连接超时。

您没有说明从哪里调用该过程。如果从命令行调用,可以尝试调整connect_timeout-变量。

【讨论】:

  • 从 PHP 代码调用。我认为connect_timeout 不是一个合适的方法。这是一种解决方法。
  • 为什么你认为connect_timeout 不是一个合适的方法或者它是一种解决方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多