Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend_Db_Adapter_Oracle:通过订单、限制和;哪里_Php_Sql_Oracle_Zend Framework - Fatal编程技术网

Php Zend_Db_Adapter_Oracle:通过订单、限制和;哪里

Php Zend_Db_Adapter_Oracle:通过订单、限制和;哪里,php,sql,oracle,zend-framework,Php,Sql,Oracle,Zend Framework,我正在尝试从Oracle 11g数据库中选择一些记录。该语句用于为HTML表实现某种“筛选”函数 要求:分页限制和对过滤结果排序 查询是使用Zend\u Db\u Select创建的 *非常有魅力: $select->where('APPLICATIONS LIKE ?', '%MYAPP1%'); $select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%'); $select->limit(20); =1个匹配结果(可以!)

我正在尝试从Oracle 11g数据库中选择一些记录。该语句用于为HTML表实现某种“筛选”函数

要求:分页限制和对过滤结果排序

查询是使用Zend\u Db\u Select创建的

*非常有魅力:

$select->where('APPLICATIONS LIKE ?', '%MYAPP1%');
$select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%');
$select->limit(20);
=1个匹配结果(可以!)

尝试对过滤结果排序时出现问题:

$select->order('PATH ASC');
=3个匹配结果

我认为这与Zend DB Select生成的查询有关,如下所示:

 SELECT z2.*
    FROM (
        SELECT z1.*, ROWNUM AS "zend_db_rownum"
        FROM (
            SELECT "APPS".* FROM "APPS" WHERE (APPLICATIONS LIKE '%MYAPP1%') AND (APPLICATIONS NOT LIKE '%GENESIS%') ORDER BY "PATH" ASC
        ) z1
    ) z2
    WHERE z2."zend_db_rownum" BETWEEN 1 AND 20
  • 如果我不按顺序运行查询,一切正常
  • 如果我不受限制地运行查询,一切都很好
  • 如果我使用订单+限额->错误结果运行查询
如果我把语句放在“介于1和20之间”之后,它就会像我想要的那样工作。但是如何说Zend DB Select来改变它呢


重要提示:我正在对Oracle视图执行查询,如果我对“表”执行查询,它也会工作。

如果您检查SQL生成中没有错误,并且WHERE子句中确实没有不同的条件,则可能是Oracle server错误。要检查它,请在不同的Oracle server版本或不同的Oracle server修补程序级别上进行尝试

显然,Oracle对查询的解释与Zend框架的意图不同: Oracle似乎在排序之前将ROWNUM与内部查询上的行号计数关联起来,因此别名zend_db_ROWNUM在外部查询的where子句中提供了错误的数字

由于我们无法控制Zend framework响应limit()指令生成SQL的方式,因此我能想到的唯一解决方法是跳过Zend limit()指令,而是按照以下方式执行操作:

$select->where('APPLICATIONS LIKE ?', '%MYAPP1%');
$select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%');
$select->order('PATH ASC');

$sql = $select->__toString();

$sql = "select * from (" . $sql . ") where ROWNUM between 1 and 20";

$stmt = $db->query( $sql, array());
$result = $stmt->fetchAll();
当然,这种变通方法只有在没有开发跨DB的情况下才是合法的,因此代码不必是DB不可知的。
也就是说,如果您使用我建议的解决方案,您将把解决方案限制在Oracle上。

如果zend将订单放在最后,则确定问题在于订单在“子选择”中(;在此SQL中,ORDER BY不能超出-ROWNUM需要在已排序的行上具体化。您可以准备或询问其他Oracle版本吗?如果可以更改SQL,可以使用row_number()窗口函数更改ROWNUM?igr:可以用更多详细信息解释此问题吗?关于ROWNUM的更多详细信息。关于row_number()的更多信息)可以在页面开始处找到以下链接。请注意,文档适用于11.2-如果您的服务器版本不同,请参考另一个版本。重要的是:我对Oracle视图执行查询,如果我对“表”执行查询,它也可以工作。我已经实现了类似的一些功能(将SQL转换为字符串,并将顺序添加到末尾)但是你的建议看起来更好。谢谢