dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか?
(チェックボックス 空欄) sql (チェックボックス 空欄)
begin;
declare cursor_name cursor
for
select * from user_ad;
fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい
注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!!
ふつうに、select文でとりだすなら分かるのですが。。。
con = Connectionのこと
処理ソースは、、、
必要最小限な部分だけ、記述しています。
PrepareStatement stmt = null;
try {
String sql = "select user_id from user_ad";
this.stmt = con.prepareStatement(sql);
//ループでデータとりだし
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
String userId = rs.getString("user_id");
}
}catch(Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());
}
fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
「fetch forward 3 from cursor_name」というSQLはPostgreSQLの拡張なので、
PostgreSQLのJDBCドライバであれば
Statement#setFetchSize()で指定行数を取得することは実行可能のようです。
(根拠 →
http://www.postgresql.jp/document/pg743doc/html/ …
ただし未検証の上、PostgreSQL7.4.3のドキュメントなので断言できませんが。
前のレスで、「ResultSetオブジェクトに・・・結果をセットしています」といいましたが
実際には
1.データベースよりデータを取得してメモリ上にデータキャッシュ
2.仮想テーブルのキャッシュデータへポインタをあてる
という状態となります。
(下記が参考になると思います
http://www.atmarkit.co.jp/fjava/rensai2/jspservl …
Statement#setFetchSize()でできることは
この仮想テーブルへのデータキャッシュについて、
デフォルトは全件とってきて乗せるところを
指定行数ずつ乗せるよう変えられるのだと思います。
またキャッシュ範囲がrs.next() で超えた場合、
次のデータ取り出しを自動に行います。
(参考:
http://inoccu.net/blog/tag/seaser2/)
そのためrs.next()でループすると3件どころか全部出てくるのだと考えられます。
(DB2で検証したところそうなりました)
ただしドキュメントを読む限り、
PostgreSQLのJDBCドライバでは違う挙動、
すなわちStatement#setFetchSize()で指定した行数だけ取得するみたいです。
ただしそれはStatement#setMaxRows()を指定したときと同じ動作だと思いますが。
>また、どうしても分りにくいのですが、
>「ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数」
>= つまり、これはdbからとりだすデータがselect結果より多い時と少ない時では、多い時に有効なのでしょうか?
setFetchSize()を使う目的は、パフォーマンスチューニングです。
たとえばデータベースのレコードが100万件もあるような膨大なデータを扱うとき、
この100万件を一気にメモリへキャッシュすることは
大きなパフォーマンス劣化とメモリ資源消費の懸念があります。
メモリの積載が少ないPCでは、エラーが発生してしまうでしょう。
これらを補うためsetFetchSize()でフェッチ件数を調整し、
パフォーマンスの向上を図ることが可能になります。
ありがとうございます。
>
setFetchSize()を使う目的は、パフォーマンスチューニングです。
たとえばデータベースのレコードが100万件もあるような膨大なデータを扱うとき、
この100万件を一気にメモリへキャッシュすることは
大きなパフォーマンス劣化とメモリ資源消費の懸念があります。
メモリの積載が少ないPCでは、エラーが発生してしまうでしょう。
これらを補うためsetFetchSize()でフェッチ件数を調整し、
パフォーマンスの向上を図ることが可能になります。
これについては、fetchSize()で件数を决めると、確かに、パフォーマンス上いいようなきがします。。。
その後色いろ試したところ、fetchSize()を指定し、それをwhileでループさせれば、fetchSize分とりだせるようになったのですが、、、
時間があきすぎたので、再度while文で質問するので、よければ回答お願いします。
ありがとうございました、とても参考になりました。。。
No.2
- 回答日時:
No1で示したAPIは、
ResultSetオブジェクトには3件ずつ
フェッチでDBアクセスして結果をセットしています。
しかしnext()で呼び出す時点では全件セットし終わった後になります。
質問者さんは3件セット毎に
結果セットの編集もしくは参照がしたいのですよね。
そういう場合には適してないようです。
どうもすみませんでした。
データベース製品によって、ベンダーの提供しているSQLドライバで
フェッチカーソルの扱いも違いがあるようです。
質問者さんの使用しているデータベースの製品名とバージョンはなんでしょう?
この回答への補足
ありがとうございます。
使用DBは、Postgresqlでバージョンは、PostgreSQL Database Server 8.1です。
>
ResultSetオブジェクトには3件ずつ
フェッチでDBアクセスして結果をセットしています。
というと、3件づつのかたまりで順にResultSetに渡されていると考えていいのでしょうか?
fetchSize()を使用しなければ、全てが順にResultSetに渡される。
javaの、StatementのsetFetchSize(),getFetchSize()を見てみたのですが、
「
この Statement で作成された ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数についてのヒントを JDBC ドライバに提供します。指定された値が 0 の場合、ヒントは無視されます。デフォルト値はゼロです。
」
これを見ると、dbからとりだすデータの行を指定できると言ってはいるのでしょうか?
fetchSizeを指定しなかったら、select結果全てがとりだされる、というわけではないのでしょうか?
また、どうしても分りにくいのですが、
「ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数」
= つまり、これはdbからとりだすデータがselect結果より多い時と少ない時では、多い時に有効なのでしょうか?
よろしくお願いします。
No.1
- 回答日時:
フェッチで結果セットを3行ずつResultSetにのせることは
次のコーディングで可能です
Statement stmt = con.createStatement();
stmt.setFetchSize(3);
ResultSet rs = stmt.executeQuery("実行SQL");
参考URLで解説がありましたので一読してみてください。
参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/ …
この回答への補足
ありがとうございます。
参考URL共に、確認してみました。
その場合どうしても分らないのですが、
rsの結果を3行とりだすには、
while(rs.next()){}を使用すると、fetchSizeに関係なく、全部とりだされてしまうのですが、
この場合、3行だけとりだすにはどうすべきなのでしょうか?
stmt.getFetchSize();では、3行とれているので、このメソッドを使用して処理するのかと思ったのですが。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
何歳が一番楽しかった?
自分の人生を振り返ったとき、何歳のころが一番楽しかったですか? 子供の頃でしょうか、それとも大人になってからでしょうか。
-
店員も客も斜め上を行くデパートの福袋
シュールを通り越して店員も客も斜め上を行くデパートの福袋に入ってそうなものを教えて下さい。 よかったらレビューもしてください。
-
JDBCでの大量データ検索でResultsetの戻りが遅い
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JaneStyleのスレッドが見れなく...
-
マイクラでPythonのプログラミ...
-
eclipseで作ったプログラムを他...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
-
あんまりお料理しないのに台所...
-
質問です。 配列が100以上の場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET DataReaderが開かれている
-
dbからデータをとりだす際、sql...
-
Formのデータが欠落することがある
-
DBNULLについて
-
C言語からデータベースにアクセス
-
JavaScriptとACCESSデータベー...
-
「XML over HTTP」「非同期HTTP...
-
ドラッグ&ドロップによるDB更...
-
struts 2つの選択肢(selec...
-
ショックウェーブムービーの質...
-
三菱GOTの画面切り替えについて
-
ボタンが活性化の場合とは、ボ...
-
リクエストに応じたselectedの...
-
C言語で今まで表示していた画面...
-
腕時計の時報をならないように...
-
フォームで同じ複数のnameで違...
-
VB6 開発環境のエディタに行...
-
登録済みイベントリスナーの情...
-
jspからServletを呼び、元のjsp...
-
漏電遮断器の黄色ボタンと白色...
おすすめ情報