• ベストアンサー

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

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

  • Java
  • 回答数2
  • ありがとう数8

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

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

  • 行数の取得

    mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします

    • ベストアンサー
    • MySQL
  • 範囲の行数を取得したいです。

    名前の定義で定義したセル範囲の行数を取得するにはどうしたら良いですか? 名前:data 範囲:Sheet1!A2:Z50 49という数字を取得したいです。 =count(data)としてもよくわからない値がでてきます。

  • SELECTでの指定行からの指定行数文の取得

    こんにちは。 OracleでSELECT文、一発で指定行から指定行数分のデータを取得するように指定できるのでしょうか? 例) SELECT * from tbl01; で、100行取得できる状態で25行目から30行分取得する OracleのSQLリファレンスを調べたのですが該当するようなものは 見当たりませんでした。 よろしくお願いします。

  • データベースから取得した値をセレクトメニューに入れたいのですが・・

    Java(servlet)からMySQLに接続し、ブラウザ画面ではJavaScriptを使ったプログラムを作っています(初心者なので、本を見ながらですが)。 ResultSet rs1=st1.executeQuery("select hiro from hirotable"); While(rs1.next()){ String hirodata=rs1.getString(1); out.println("<form>");  out.println("<select>"); out.println("<option>+hirodata+</option>"); データベースから取得した値をセレクトメニュー内にすべて表示させたいのですが、このようにするとデータの数だけセレクトメニューができてしまいます。配列の考え方が今ひとつピンとこないのですが、これと関係しているのでしょうか?どなたか教えていただけないでしょうか? よろしくお願い致します。  

    • ベストアンサー
    • Java
  • PostgresSQL のSQL文について(SELECT)

    PostgresであるSelect文がわかりません。 以下のテーブルより *KOUMOKU*[テーブル名] SUB1|SUB2|SUB3|SUB4|SUB5|ID_NAME A01 | | | | |大項目1 A01 |B01 | | | |大項目2 A01 |B01 |C01 | | |大項目3 A01 |B01 |C01 |D01 | |大項目4 大項目1~大項目4の値(ID_NAME)を一気に取得する SELECT文がわかりません。 よろしくお願いいたします。

  • JDBCのバグ?それともプログラム(Java)のバグ?

    JavaからJDBC経由でPostgreSQLにSELECT文を発行し、 結果を受けて更に処理をするプログラムを作成しております。 その際、SELECTの結果をResultSet.next()メソッドを使い、 while文で結果の行数分処理をしようとしております。 しかし、複数行SELECT文の結果があるにもかかわらず、 1回のループで終わってしまい、 後は下記のExceptionが発生してしまいます。 Exceptionを読む限りでは、コネクションが閉じられていると分かるのですが、 プログラムでは一番最後のステップでデータベースとの切断をしております。 この様な現象のときは、JDBCが悪いのでしょうか?それともプログラムのつくりが悪いのでしょうか? 【 以下サンプルソース 】 Connection con = null; Statement st = null; ResultSet rs = null; try{ Class.forName("org.postgresql.Driver"); con = DriverManager.getConnection(jdbc:postgresql://localhost:5432/hoge?user=hoge&password=hoge); st = con.createStatement(); rs = st.executeQuery("select hogehoge from hogerake"); // 必ず複数行戻ります。 while(rs.next()){ // 処理 } con.close(); st.close(); rs.close(); }catch(Exception e){ e.printstackTrace(); } 【 以上サンプルソース 】 【 以下コンソール 】 org.postgresql.util.PSQLException: Connection is closed. Operation is not permitted. at org.postgresql.jdbc1.AbstractJdbc1ResultSet.next(AbstractJdbc1ResultSet.java:134) at jp.co.comsys.felica.ExitManagement.main(ExitManagement.java:10) 【 以上コンソール 】

  • JDBC PostgreSQLで必要なファイルはあるのでしょうか?

    LinuxでPostgreSQLのデータベースをJDBCでアクセスしたいのですが、以下のソースで次のエラーが発生します。何か必要なファイルでもあるのでしょうか? java.lang.ClassNotFoundException:org.postgres.Driver また、LinuxのODBCも必要なファイルがあるのでしょうか? import java.sql.*; class jdbcSample2 { public static void main(String argv[]) { int a; String b; try { //Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); //String url = "jdbc:odbc:test"; Class.forName ("org.postgres.Driver"); String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = ""; String password = ""; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String query = "select * from member;"; ResultSet rs = stmt.executeQuery (query); while(rs.next()){ a = rs.getInt(1); b = rs.getString(2); System.out.println(a + ", " + b); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } } }

  • CSVファイルのデータの行数を取得したい

    こちらではいつもお世話になっています。Perlに関して、初心者ですが教えてください。 CSVファイルについて、データの存在する行数を取得したいと考えています。自分なりに考えたところでは、下記の方法で取得できるのではと思ったのですが・・・・・ open(FH,"data.csv"); @array = <FH>; $count = $#array; close(FH); data.csvは、1行目から順にデータが入っています。 これで、$countに1を足せばCSVデータの行数になるのではないかと考えています。 しかし、実際に動かしてみると、$countには、data.csvにデータがあるのに「-1」(要素なし)が返ってきます。何か間違いがあるのでしょうか。 あるいは、別にCSVデータの行数を取得する方法が他にあれば、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Select文で2つのフィールドを加算した結果を取得したい

    Select文で2つのフィールドを加算した結果を取得したいと思います。しかし2つのフィールドのうち1つがNullの値だと残りのフィールドに値が入っていても空白(NULL?)で返ります。 [例]********************************************** フィールドA:Null フィールドB:300 SELECT フィールドA+フィールドB FROM テーブルA <Selectされた結果> 空白(何も表示されない。Null?) [例]********************************************** どのようにすれば、Nullでない値だけ取得できるでしょうか。

  • select count(*)の結果に1を足したものを、主キーにしようとしています

    プログラミング初心者です。 よろしくお願い致します。 主キーになる列がないので、行No列を作り select count(*)でレコード数を取得後+1したものを、 insertで登録しようとしていますがうまくいきません。 間違っているところなど、ご指摘いただきたいです。 // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // データベースへ接続 con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","HR","redhat"); // ステートメントを作成 smt = con.createStatement(); // 変数zにレコード数を入れる     int z = getint("select count(*) from money"); // 変数z(現在のレコード数)+1 z = z + 1; // SQLを実行して結果を得る int row_count = smt.executeUpdate("insert into money (key_number, month, day, subject, from_place, to_place, traffic, place, naiyou, money) values ('" + z +"','" + A1 +"','" + B1 + "','" + C1 + "','" + D1 + "','" + E1 + "','" + F1 + "','" + G1 + "','" + H1 + "','" + I1 + "')");

    • ベストアンサー
    • Java

専門家に質問してみよう