[Seasar-user:6242] Re: [DBFlute]Behavior のPagingについて

kubo [E-MAIL ADDRESS DELETED]
2007年 2月 20日 (火) 02:00:28 JST


久保です。

米原さんへ

> logから察するに、「レコードが選択されませんでした」となっているよう
です。
> 発行されているSQLをじか打ちしてもやはり「レコードが選択
> されませんでした」となります。「rownum > 100」の指定のために
> 何も選択されないようです。


すいません、調べた結果単刀直入に言いますと
「OracleのfetchPage()」がBugってました。

rownumに関して自分が勘違いしていました。


select *
  from (select * from xxx order by xxx)
 where rownum <= 10

は正常に動作します。
なので、ConditionBeanのfetchFirst()のみの検索はうまく動作しますが、


select *
  from (select * from xxx order by xxx)
 where rownum > 10 and rownum <= 20

は必ず0件が帰ってきてしまいます。

正しくは

select *
  from (select base.*, rownum as rn
         from (select * from xxx order by xxx) base
       )
 where rn > 10 and rn <= 20

というように書かなければなりません。



Googleで以下のようなキーワードで検索すると同じようなことを
書かれている方がいらっしゃいます。

「OracleではLimit句が使えない」
「ROWNUM を使用した擬似スクロール・カーソル」




手元のにOracleが無いため、動作確認が済んでいない状態で
まことに申し訳御座いませんが、下記のMethodを修正して
試して頂けませんでしょうか?

xxx.allcommon.cbean.sqlclause.SqlClauseOracle の doFetchPage()

    protected void doFetchPage() {
        if (!isFetchStartIndexSupported() && !isFetchSizeSupported()) {
            return;
        }
        _fetchScopeSelectHint = " * from (select base.*, rownum as rn from (select";
        _fetchScopeSqlSuffix = "";
        if (isFetchStartIndexSupported()) {
            _fetchScopeSqlSuffix = ") base ) where rn > " + getPageStartIndex();
        }
        if (isFetchSizeSupported()) {
            if (isFetchStartIndexSupported()) {
                _fetchScopeSqlSuffix = _fetchScopeSqlSuffix + " and rn <= " + getPageEndIndex();
            } else {
                _fetchScopeSqlSuffix = ") base ) where rn <= " + getPageEndIndex();
            }
        }
    }






> ※※※※※※※※※※※※※※※※※※※※※※※※
> ちなみに以前ご教授頂いた外だしSQLのPAGING
> においては以下のようにSQLを作成して実現しました。
> (良いSQLかわかりませんが・・・)
> 
> 
> select a.* , a.n from
>  (select b.* , rownum n
>   from
>    (select KYOGAKAISYACD, KYOGAKAISYANAME, JIGYOSYONAME, KYOGASYANAME, NAIYO, TELNO, ICHIRANCD from SMPKYOGATBL
>    order by KYOGAKAISYACD
>    )b
>  )a
> where a.n > 100 and a.n <= 125

こちらの書き方が正しいですね。
DBFluteのドキュメントも直しておきます。

# 自分すっかりOracleから離れて弱者となってしまいました...orz



-- 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
kubo   <[E-MAIL ADDRESS DELETED]>
jflute <http://d.hatena.ne.jp/jflute>
株式会社ビルドシステム <http://www.buildsystem.co.jp>
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/





Seasar-user メーリングリストの案内