1

情况如下:我正在使用 Zend Framework 2 连接到 Oracle 数据库。我已将“Pdo_Oci”指定为适配器的驱动程序。我正在使用 Select 对象来构建查询并执行它们。

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

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

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

1) 我的期望是错误的,limit() 方法只是对 LIMIT 的简单包装,不能用于 Oracle 数据库。像这样的帖子似乎表明情况并非如此,但我可能读错了。

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

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

我没有明确地形成一个连接字符串。我在 local.php 中只有必要的数据库配置:

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');
4

1 回答 1

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偏移方法。

我希望这对其他人有帮助。

于 2013-05-08T09:13:12.993 回答