sql - 如何向 mysql 5 存储过程中运行的查询传递限制?

标签 sql mysql stored-procedures

这是我想做的事情的示例。 当查询中存在 LIMIT 时,存储过程无法创建。 如果我取消程序创建的限制。

CREATE PROCEDURE LimitTest(IN in_start INTEGER UNSIGNED, IN in_limit INTEGER UNSIGNED)
BEGIN
   DECLARE no_more_results INTEGER DEFAULT 0;
   DECLARE var_result INTEGER UNSIGNED;
   DECLARE row CURSOR FOR SELECT id from test LIMIT in_start,in_limit;
   DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_results = 1;
   OPEN  row;
      FETCH  row INTO var_result;
      REPEAT 
         INSERT INTO results VALUES(var_result);
         FETCH  row INTO var_result;
      UNTIL no_more_results = 1
      END REPEAT;
   CLOSE row;
END

最佳答案

问题是 limit 后面的数字必须是常量,不能是 this bug report 规定的参数。在 MySQL 的更高版本中仍未修复。您可以尝试(丑陋的)解决方法 outlined here :-

CREATE PROCEDURE sp (
IN LimitStart_ INT,
IN LimitCnt_ INT
)
BEGIN
SET @lim = CONCAT(' LIMIT ', LimitStart_, ',', LimitCnt_);
SET @q = "SELECT mycol FROM mytable";

SET @q = CONCAT(@q, @lim);
PREPARE st FROM @q;
EXECUTE st;
DEALLOCATE PREPARE st;
END;

关于sql - 如何向 mysql 5 存储过程中运行的查询传递限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330005/

相关文章:

php - 使用 PHP 在 SQL 数据库中搜索部分匹配

sql - 将 IP 地址范围导入数据库表 - 如何检查 T-SQL 中的范围冲突?

mysql - 使非规范化模式保持最新的最佳实践?

php - 如何在mysql存储过程中使用while循环获取日期并将记录插入数据库

php - Firebird 程序不仅在 PDO 中执行

SQL Server : use CASE with LIKE

sql - 将 select 查询结果转换为 Json

sqlite - SQLite3从一个表获取输出作为另一表的输入

javascript - Php 数组和 chartjs

php - 从文本区域到单行字符串的多行