不能在存储过程中使用偏移和限制

时间:2015-07-13 18:54:09

标签: mysql

目前我使用offsetlimit从表中检索有限数据,但是当我将数据库从development移动到hosting server时,它会在查询时显示语法错误,如果我删除offsetlimit语法,它将运行良好。关于这个问题的任何想法或解决方案?

    SELECT
    e.A,
    e.B,
    e.C,
    e.D,
    e.E,
    e.F,
    e.G
    FROM
    T1 e
    where e.A = 1
    order by e.B desc
    limit in_count
    offset in_offset;

enter image description here

3 个答案:

答案 0 :(得分:1)

根据官方的mysql网站:

  

为了与PostgreSQL兼容,MySQL支持LIMIT row_count   OFFSET偏移语法。

我认为你的语法是正确的,问题可能在于LIMIT/OFFSET子句中使用的过程变量,或者数据库引擎解释它可能具有较旧的不兼容版本的方式解释OFFSET

作为替代解决方法,请尝试在LIMIT子句中使用,逗号分隔来指定OFFSET,这可能会解决问题。

SELECT
    e.A,
    e.B,
    e.C,
    e.D,
    e.E,
    e.F,
    e.G
    FROM
    T1 e
    where e.A = 1
    order by e.B desc
    limit in_offset,in_count;

答案 1 :(得分:0)

您的问题很可能是由于您的托管服务提供商使用的旧版MySQL服务器而不是您在测试中使用的版本。

您描述的问题是MySQL中已修复的错误:http://bugs.mysql.com/bug.php?id=11918

该修复程序自2010年第三季度开始发布,版本为5.5.6。  http://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-6.html

如果您的托管服务提供商拥有5.5.6之前的MySQL版本,这就解释了您的难度。发出

 STATUS

命令MySQL让它告诉你它的版本等等。

答案 2 :(得分:0)

您不能像这样填写in_countin_offset。 (类似地,您不能传入表名或其他一些结构。)

相反,使用CONCAT构建一个字符串,其中包含填充了SELECT等的in_count。然后PREPAREEXECUTE和{ {1}}。

(请勿使用DEALLOCATE尝试填写USING;由于同样的原因,它会失败。因此使用in_count。)

参考:

例如:

CONCAT