Zend Framework 2 - Oracle驱动程序和limit()方法

时间:2013-02-20 17:00:46

标签: oracle zend-framework2

情况就是这样:我正在使用Zend Framework 2连接到Oracle数据库。我已经指定'Pdo_Oci'作为我的适配器的驱动程序。我正在使用Select对象来构建查询并执行它们。

一切都很顺利,直到我尝试在Select对象上使用limit方法。由于我正在与Oracle交谈,并且Oracle没有LIMIT,我希望框架生成一个对Oracle有意义的sql字符串并模拟LIMIT(我猜是使用ROWNUM)。

但是,生成的sql只有LIMIT关键字,当然执行时会出现错误,因为我的数据库不知道如何处理它。

所以,我看到了两种可能性:

1)我的期望是错误的,而limit()方法只是LIMIT的一个简单包装器,不能与Oracle数据库一起使用。像this one这样的帖子似乎暗示情况并非如此,但我可能读错了。

2)我做错了什么。我应该使用其他驱动程序吗?

编辑:在回答ZF2学生的问题时,还希望为人们提供更多帮助我的背景:

我没有明确地形成连接字符串。我只是在local.php中有必要的db配置:

return array(
    'db' => array(
                'driver' => 'Pdo_Oci',
                'database' => 'my_database_host',
                'username' => 'my_user_name',
                'password' => 'my_password'

    ),  
);

在我的global.php中,我设置了一个适配器工厂:

return array(     
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
            'aliases' => array(
                    'db' => 'Zend\Db\Adapter\Adapter',
            ),            
    ),

);

我在控制器中检索适配器,如下所示:

$db = $this->getServiceLocator()->get('db');

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,但这要归功于Zend Framework的2.1更新。显然在2.0中没有提供oci特定的驱动程序。我的'pdo_oci'尝试实际上默认为通用pdo驱动程序。

使用zf 2.1。,我正在指定我的连接:

'db' => array(
            'driver' => 'oci8',
            'username' => 'myUser',
            'password' => 'myPW',
            'connection' => '(DESCRIPTION =
              (ADDRESS_LIST =
               (ADDRESS = (PROTOCOL = TCP)(HOST = myHost)(PORT = myPort))
              )
             (CONNECT_DATA =
              (SERVICE_NAME = myService)
             )
            )'
)

2.1框架将使用Zend \ Db \ Adapter \ Driver \ Oci8命名空间中的类,它们将正确使用oci8扩展 - 仍需要在php.ini中启用 - 并为其创建正确的sql限制和抵消方法。

我希望这有助于其他人。