揮発性のメモ2

http://d.hatena.ne.jp/iww/

PDOを使って OracleでLIMITを実装する

前やった方法⇒OracleでLIMITを実装する - 揮発性のメモ
これだと、副問い合わせ(インラインビュー)されるので、外部結合してカラム数が1000超えてるときとかにエラーになってしまう。


PDOを使う方法

SELECT a,b,c FROM hoge ORDER BY a LIMIT 10,20;
$query = "SELECT a,b,c FROM hoge ORDER BY a";
$offset = 10;
$count  = 20;


$sth = $dbh->prepare( $query, array( PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL ) );
//for( $i=0; $i<$count; $i++ ){
for( $i=1; $i<=$count; $i++ ){
    $datas = $sth->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $offset+$i );
    if( $datas===FALSE )break;
    // なんか処理
}
$sth->closeCursor();

プリフェッチするときにカーソルがスクロール可能であると設定して、フェッチするときにカーソルの絶対位置を指定する。
必要な個数だけフェッチしたらあとは破棄する。
※カーソルの位置はどうも1始まりっぽい。

長所:副問い合わせがなくなってすっきりする
短所:なんか遅い