Oracle db 查询分页困难,错误是:“命令未正确结束”

Posted

技术标签:

【中文标题】Oracle db 查询分页困难,错误是:“命令未正确结束”【英文标题】:Oracle db pagination difficulties with query, error is : "command not properly ended" 【发布时间】:2014-02-04 05:34:05 【问题描述】:

我正在执行以下分页查询。 当我跑步时

$s= oci_parse($conn,"select * from TBL_Name order by D_DATE desc");
$r = oci_execute($s);

然后没有显示错误。当我写以下内容时:

$s= oci_parse($conn,"select * from TBL_Name order by D_DATE desc limit $start,$limit");
$r = oci_execute($s);

error is:  oci_execute(): ORA-00933: SQL command not properly ended .

这意味着问题出在" limit $start,$limit ",但我需要这个来进行分页。 LIMIT 可能在 Oracle 中无效。现在我该如何编写这个查询?

【问题讨论】:

Oracle 有 ROWNUM 来限制获取的行。但同时它不能这样使用。 当我写成 $s= oci_parse($conn,"select * from TBL_Name order by D_DATE desc limit '$start','$limit'");或将值作为“限制 0,12”给出相同的问题。 @亚历山大 那可能是什么问题? @OracleUser Oracle 不支持 LIMIT。希望question 对您有兴趣! 我为你更新了答案.. rownum 是用你的结果集生成的东西.. 所以它总是小于等于.. 所以我们首先使用不同的方法生成最大限制和别名的 rownum名称.. 并使用来自外部查询的别名。 【参考方案1】:

ROWNUM 是由您的结果集生成的。 pseduocolumn.. 所以它总是可以小于等于.. 所以我们首先使用不同的名称生成最大限制和别名的 rownums.. 并使用来自外部查询的别名。

select * from 
( select a.*, ROWNUM rnum from 
  (select * from TBL_Name order by D_DATE desc ) a 
  where ROWNUM <= $end )
where rnum  >= $start;

php 代码

// Parse a query containing a bind variable.
$stmt = oci_parse($conn, "    select * from  " +
                                          " ( select a.*, ROWNUM rnum from " +
                                          "   (select * from TBL_Name order by D_DATE desc ) a "+
                                          "    where ROWNUM <= :end) "+
                                          "   where rnum  >= :start) ");

// Bind the value into the parsed statement.
oci_bind_by_name($stmt, ":end", $end);
oci_bind_by_name($stmt, ":start", $start);

【讨论】:

这个答案应该是写的,但同样的错误正在显示......我无法找出原因。 对于第一次迭代你设置了什么值,我怀疑它们被传递为 null.. 所以查询字符串不完整。 好的。。使用尝试绑定变量的方式也是错误的。 哦,我犯了一个愚蠢的错误。现在它运作良好。感谢您的关心。【参考方案2】:

limit $start,$limit 仅适用于 mysql,它对 Oracle 或其他数据库没有帮助(尽管 @Charles 在 cmets 中指出,使用 OFFSET is used elsewhere as well 限制)。

对于 Oracle,它类似于

select * from (
select foo.*, ROWNUM rnum
  from  
( select * from TBL_Name order by D_DATE desc  ) foo
 where ROWNUM <= $end) where rnum >= $start;

【讨论】:

ROWNUM > 是不可能的,因为它是一个伪列! FWIW,LIMIT 子句is not just for MySQL。 @Charles 但limit $start,$end 是,AFAIK。 @eis, SQLite as well,这也让我研究了if Postgres allows the comma (no),其中我了解到 SQL:2008 finally 添加了用于结果限制的语法......和当然,它与任何现有实现都不同。光荣。 好吧,好像是这样。他们似乎不喜欢支持它,“强烈鼓励程序员使用使用“OFFSET”关键字的 LIMIT 子句的形式,并避免使用带有逗号分隔偏移量的 LIMIT 子句。” :)

以上是关于Oracle db 查询分页困难,错误是:“命令未正确结束”的主要内容,如果未能解决你的问题,请参考以下文章

oracle 高效分页查询SQL

Service层有多个查询,若依分页失灵?教你如何解决!

oracle 一对多数据分页查询筛选

oracle db 如何用一条sql查询2个时间之间的工作时间间隔

oracle中怎么获得sql语句的错误信息

Oracle基本语法&&函数&&子查询&&分页查询&&排序&&集合操作&&高级分组函数