SQLの結果の取得方法について

このQ&Aのポイント
  • SQLの結果の取得方法はResultSetとカーソルの2種類があります
  • ResultSetで取得した場合、データをすべてメモリに展開する方法と1行ずつ取得する方法があります
  • 巨大なレコード数を取得する際は、カーソルを使用するかsetFetchSizeで1行指定する方法がパフォーマンスが良いです
回答を見る
  • ベストアンサー

SQLの結果の取得方法について。

件名の件でいくつか質問があります。 そもそも質問がおかしいということがあるかもしれませんので、もしそうだった場合はご指摘頂けると嬉しいです。 1.SQLの結果の取得方法はResultSetで複数行を取得する方法とカーソル(こっちもクラスはResultSet?)で1行ずつ取得する方法の2種類があるのでしょうか?  ※ PL/SQLなどではなくjavaでの実装になります。  またカーソルで取得する実装方法など参考になるサイトがありましたら教えて頂けると助かります。  PL/SQLのサイトばかりがヒットしてしまいまして・・・。 2.ResultSetで取得した場合、全部のレコードをメモリに展開するのでしょうか? それとも1行(もしくは複数行)毎にDBから実データを取得するのでしょうか。  自分で調べたところではResultSetの実装によるということですが、一度にメモリに展開するドライバもあれば、1行や複数行で展開するドライバもあるということでしょうか。  例えばOracleやDB2やPostgreSQLなどがどのような実装であるかはよく分かりませんでした。  それぞれがどのように実装されているか調べるにはどのようにすればよいでしょうか。 3.巨大なレコード数を結果として取得する際はResultSetで取得するとメモリを圧迫するから、1行ずつ取得した方がパフォーマンスがいいかもしれないとサイトで見たのですが、これはカーソルを使用するということでしょうか?  それともsetFetchSizeで1行指定をしてResultSetで取得するということでしょうか。 4.setFetchSizeは1文にしか反映されないと、どこかのサイトでみたのですが、1文というのはSQL1回ということでしょうか。  同じStatmentで違うSQLを発行する場合は発行毎にsetFetchSizeを呼び出すということでしょうか。  それとも例えば1SQLの結果が100レコードでsetFetchSizeを10にした場合、ループ内で10回setFetchSizeを設定しないといけないということでしょうか? 調べている動機はたくさんのレコードを取得するSQLがあるのですが、フェッチ?カーソル?で取得した方がパフォーマンスがいいのではという話を受けたのですが、その人もあまり詳しくなく、ネットで調べていたのですが、上記のような疑問が中々解消できず質問させて頂いた次第です。 よろしくお願い致します。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#147388
noname#147388
回答No.1
_alias_
質問者

お礼

お礼が遅れてしまい申し訳ありませんでした。

関連するQ&A

  • ROW_NUMBER BY PL/SQL

    こんばんは。 今PL/SQLで開発をしているのですが、PL/SQLでわからないことがあります。 日付のソート順に並べたデータの中から、何行目から何行目までのデータを取得、ということがしたくてROW_NUMBERを使ってSQL文を作成しました。 そのSQL文はきちんと動くのですが(データ取得できる)、それをPL/SQLにてカーソル宣言するとコンパイルエラーになってしまいます。 ROW_NUMBERの部分を削除するとコンパイルは通るので、原因はROW_NUMBERにあるようです。 しかしながら、ROW_NUMBERを使わずに、何行目から何行目までのデータ取得、ということが実装できるのか検討もつきません。 どうしてカーソルでROW_NUMBERが使えないのか? ROW_NUMBERのかわりのようなコマンド、もしくは実装方法が存在するのか? 不明な点は補足させていただきますので、ご教示の程宜しくお願い致します<(_ _)>

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • oracle10g update件数の取得方法

    oracle10g update件数の取得方法 pl sql(stored procedure)で複数のupdate文を適用します。update後にupdateしたレコード件数をログテーブルにinsertしたいのですが、updateしたレコード件数を取得する方法はありますか?

  • PL/SQLについて

    PL/SQLについて お世話になります。 現在Oracle 11gと.Net C#で開発をしている物です。 正直どちらも初心者で悪戦苦闘している日々ですが、 PL/SQLのカーソルについて知りたい事があります。 PL/SQLでカーソルを作成しました。 そしてその同一ストアドプロシージャ文の中で、 先のカーソルの結果で得られた値から別の新たなカーソル でまた新たな結果を返すと言う様な、二重カーソルの様な 事は可能でしょうか。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。 出来れば、サンプルや、HP等ご紹介頂ければありがたく 思います。

  • ソート(PL/SQL)

    おはよーございます。 今PL/SQLを使っているのですが、まだ関数(?)とかよくわかんなくて、困ってます。 レコードの索引付き表(二次元配列)の中の、このカラムを使ってソートしたい!、というときはどうしたらいいんですか? ちょっと言葉が足りないかもしれないので補足しますので、実装方法を教えてください。 よろしくお願いします(ペコリ)

  • T-SQL(1件のみの取得)(再度)

    前回、-SQL(SQL Server2000)で対象データを一件のみ取得する場合、どのようにすれば良いでしょうか? 処理的に無理でしょうか? PL/SQLの"ROWNUMBER = 1"のような条件は使うことが出来ないのでしょうか? 上記の内容の質問をさせて頂いて、『TOP』が使用できるという回答をもらったのですが、この『TOP』は、SELECT文で取得しようとする場合 どのようにすれば良いでしょうか? ヘルプ等で調べてみたものの、良く理解できませんでした;; 取得内容としては、該当データ1レコード内の1フィールドを取得したいです。 /* PL/SQLから引用 */ SELECT 項目A   FROM テーブルA WHERE 項目A = 'AAA' AND 項目B = 10 AND ROWNUMBER = 1 この様な、取得方法を使用したいのですが、T-SQLではどのように行えばよろしいでしょうか? また、別の方法がありましたらお教えください。。。

  • pl/sql ストアドからレコードセットを返す

    カーソルを使わずに結果セットを返す方法を知りたいです。 戻り値または、引数で返してもかまいません。 また、同様に動的SQLの結果を返す場合を教えてください。 ※結果セットは複数行の場合です。

  • PL/SQLを使用した、プログラミング方法について

    今、独学でPL/SQLについて学習しているのですが、下記の問題が解けません。。。 考えても、自分の答えが出ないので質問させてください。 ------------------------------------------------------------ 下記の表(temp表)をPL/SQLのカーソルを使い取得しました。 temp表:主キー=No ------------------ No,ID, 処理, 数値 1 , A, 加算(1), 1000 2 , A, 加算(1), 500 3 , A, 減産(2), 500 4 , A, 加算(1), 100 ----------------- 5 , B, 加算(1), 200 6 , B, 減産(2), 100 7 , B, 加算(1), 50 ------------------ 8 , C, 加算(1), 100 9 , C, 減産(2), 50 ※加算の場合、値は「1」減算の場合、値は「2」です。 (1)その後、取得した値を使って、ID別の数値残高を計算したいです。 「加算」「減算」の区別は、「処理」カラムを使って区別をつけたいです。 例:ID「A」の数値残高 = 1000+500-500+100   ID「B」の数値残高 = 200+100-50 (2)1つのIDの計算が終了したら、次のIDの計算が始まる。 例:ID「A」の数値残高が計算終了→ID「B」の残高計算開始→ID「C」の残高計算開始 (3)その後、(2)で計算した値を、ほかのテーブル(answer)に挿入したいです。 例: answer表 ID, 数値残高 -------------- A, 1100 B, 150 C, 50 このような処理をPL/SQLを使って、実装したいのですが。 (1)(2)(3)の処理を教えて頂けないでしょうか? ※1つのIDあたり、1万レコードを持っています。 パフォーマンス(処理速度)も考えて、プログラミングしたいです。 もし、カーソルを使って表を取得する意外に、よい方法があるならば、そちらの方法でも可能です。 ご教授・ご回答よろしくお願いします。質

  • PL/SQLで実行したSQLのログの取得について

    ASP(ActiveServerPage)より、PL/SQLのFunctionを実行し、Oracleの複数のTABLEを更新しようとしています。 ASPから実行する際には、引数を渡し、その引数をSQL実行の条件としていますが、実際に実行されたSQL文のログを取得したいのですが、どうしたらよいでしょうか? 何か良い方法をお教えいただけますよう、よろしくお願いいたします。 [実行環境] DB:Oracle8i