• ベストアンサー

PostgresSQL JDBC で Select結果の行数を取得したい

PostgresをJDBCから利用しています。 select * from ta を実行した結果である ResultSetがあるとします。 select count(*) from ta は使用しないものとします... この行数を取得したいのですが、 Javaは最近始めたものでなんだかうまくいきません。 行数取得の後は、先頭から順に値を取り出すので、ResultSetの内部カーソル(?)は最初にあって欲しいです。 どうぞよろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)
回答No.1

DBの実装によるとは思うのですが、 普通はDBにSQLを発行して、ResultSetを取得した時点では、対象の全てのレコードを取得しているわけではないです。発行した時点で何レコードあるかは未知です。 何レコードあるかは、全レコード取得して初めて判明すると思います。 (ResultSetが生成された時点では、まだ全レコード取得しているわけではなく、必要に応じて内部で取得しています。例えば100レコードずつとか) それをふまえたうえで、行数を取得するには、ResultSet#last() で最終行に移動して、ResultSet#getRow()で行番号を取得すれば分かると思います。先頭に戻すには、ResultSet#first()とします。 ただし、それは「select count(*) from ta」とするよりもはるかに効率の悪いものになるかもしれません。 #他の言語で、行数が取得できるAPIがあったかも知れませんが、同じように効率が悪い事を内部でしているのだと思います。

関連するQ&A