- ベストアンサー
PostgresSQL JDBC で Select結果の行数を取得したい
PostgresをJDBCから利用しています。 select * from ta を実行した結果である ResultSetがあるとします。 select count(*) from ta は使用しないものとします... この行数を取得したいのですが、 Javaは最近始めたものでなんだかうまくいきません。 行数取得の後は、先頭から順に値を取り出すので、ResultSetの内部カーソル(?)は最初にあって欲しいです。 どうぞよろしくお願い致します
- みんなの回答 (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の資料から調べてください。
その他の回答 (1)
- sasadora
- ベストアンサー率68% (59/86)
DBの実装によるとは思うのですが、 普通はDBにSQLを発行して、ResultSetを取得した時点では、対象の全てのレコードを取得しているわけではないです。発行した時点で何レコードあるかは未知です。 何レコードあるかは、全レコード取得して初めて判明すると思います。 (ResultSetが生成された時点では、まだ全レコード取得しているわけではなく、必要に応じて内部で取得しています。例えば100レコードずつとか) それをふまえたうえで、行数を取得するには、ResultSet#last() で最終行に移動して、ResultSet#getRow()で行番号を取得すれば分かると思います。先頭に戻すには、ResultSet#first()とします。 ただし、それは「select count(*) from ta」とするよりもはるかに効率の悪いものになるかもしれません。 #他の言語で、行数が取得できるAPIがあったかも知れませんが、同じように効率が悪い事を内部でしているのだと思います。