[PHP-users 19035]Re: PEARDBでOracle操作について

ISIGE, Akira xia @ silvia.com
2003年 11月 20日 (木) 15:35:29 JST


いしげ です.

On 2003/11/20 14:56:57 JST,
masanori usui <usui.masanori @ jungleskill.com> wrote:

> > <?php
> >   $db =& DB::connect( 'oci8://〜〜' );
> >   $db->setOption( 'optimize', 'portability' );
> > ?>

これですが,書き忘れましたが,
この setOption() はマニュアルに載っていませんね.
将来,メソッド名の名前が変わったりしても,
非互換アナウンスがされないかもしれません.

# といっても他にマシな options 設定方法があるわけでもないし


> ちなみに、こういった情報ってどこからGETしてるんですかね〜〜

自分は,DB_DataObject が oci8 で動かなくて,
ソースを読んで調べました.


> ってやると$rowsにdb_error Objectが入ってしまうのですが、どなたかエラーの
> 原因がわかりますでしょうか?(ちなみに、これもPostgreSQLだと動きました)

DB/oci8.php を見ると,こんな風になってました.

> function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum=NULL)
> {
>   if ($rownum !== NULL) {
>     return $this->raiseError(DB_ERROR_NOT_CAPABLE);
>   }

つまり oci8 では $rownum を指定するとタチドコロにエラー,と.

oci8.php の上記の部分を rownum エミュレートするコードに書き換えて
bugs.php.net あたりに投げる,ってのが正しい手順だと思いますが,
当面のところ,

  (a) range(1, $from ) の間,空の fetchInto() を回してから,
      rownum を指定しない fetchInto() でデータをフェッチするようにする.

あるいはメモリ大尽なら

  (b) 面倒なので最初から getAll() しちゃって,
      array_slice( $result, $from, ( $to - $from ) ) を取得する.

といった手段で手っ取り早く仕事を片付ける,という手もあります.


ちなみに,oci8.php を改造する時は,
/usr/local/lib/php/DB/oci8.php を改造するのではなく,
件のプロジェクトの include_dir にコピーしてきてそれを改造した方がよろしいかと.


--
ISIGE, Akira



PHP-users メーリングリストの案内