dポイントプレゼントキャンペーン実施中!

PostgresをJDBCから利用しています。

select * from ta
を実行した結果である ResultSetがあるとします。

select count(*) from ta
は使用しないものとします...

この行数を取得したいのですが、
Javaは最近始めたものでなんだかうまくいきません。

行数取得の後は、先頭から順に値を取り出すので、ResultSetの内部カーソル(?)は最初にあって欲しいです。

どうぞよろしくお願い致します

A 回答 (2件)

select count(*) を使用せず


カーソルを移動させたくないとなると
先の返答にもあるとおり、
 ResultSet#last()で最終行に移動後、
 ResultSet#getRow() で取得
 ResultSet#first()でカーソルを戻す
 という方法になるでしょう。

ただし、これを行う場合、以下のことが必要です。
・JDBCがJDBC2.0のスクロールに対応している
・ステートメントを生成する際に
 TYPE_SCROLL_SENSITIVEまたは
 TYPE_SCROLL_INSENSITIVEを指定する
(例)
con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);


ただし、この方法だと型が特殊なデータなどで
取得できない場合があります。
この制約はプロダクト依存ですので
PostgresSQLの資料から調べてください。
    • good
    • 0

DBの実装によるとは思うのですが、


普通はDBにSQLを発行して、ResultSetを取得した時点では、対象の全てのレコードを取得しているわけではないです。発行した時点で何レコードあるかは未知です。
何レコードあるかは、全レコード取得して初めて判明すると思います。
(ResultSetが生成された時点では、まだ全レコード取得しているわけではなく、必要に応じて内部で取得しています。例えば100レコードずつとか)

それをふまえたうえで、行数を取得するには、ResultSet#last() で最終行に移動して、ResultSet#getRow()で行番号を取得すれば分かると思います。先頭に戻すには、ResultSet#first()とします。

ただし、それは「select count(*) from ta」とするよりもはるかに効率の悪いものになるかもしれません。

#他の言語で、行数が取得できるAPIがあったかも知れませんが、同じように効率が悪い事を内部でしているのだと思います。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!