1

状況は次のとおりです。ZendFramework2を使用してOracleデータベースに接続しています。アダプタのドライバとして「Pdo_Oci」を指定しました。Selectオブジェクトを使用してクエリを作成し、実行しています。

Selectオブジェクトでlimitメソッドを使用しようとするまで、すべてがうまくいきました。私はOracleと話していて、OracleにはLIMITがないので、フレームワークがOracleにとって意味のあるSQL文字列を生成し、LIMITをエミュレートすることを期待していました(ROWNUMを使用していると思います)。

ただし、生成されたSQLにはLIMITキーワードが含まれているだけです。もちろん、データベースがそれをどう処理するかわからないため、実行時にエラーが発生します。

したがって、2つの可能性があります。

1)私の期待は間違っており、limit()メソッドは、Oracleデータベースでは使用できないLIMITの単純なラッパーにすぎません。このような投稿は、そうではないことを示唆しているようですが、私はそれを間違って読んでいる可能性があります。

2)私は何か他のことを間違っています。別のドライバーを使用する必要がありますか?

編集: ZF2学生の質問に答えるだけでなく、人々が私を助けるためのより多くのコンテキストを提供することを期待して:

接続文字列を明示的に形成していません。local.phpに必要なdbconfigがあります。

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

私はこれをなんとか解決しましたが、ZendFrameworkの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 に答える