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 查询分页困难,错误是:“命令未正确结束”的主要内容,如果未能解决你的问题,请参考以下文章