結果セット
データベースクエリにより,多くの行のデータが返されると,結果を保持するのに非常に多量のメモリが必要となることがある.データの処理において一度にすべてのデータが必要なわけではない場合は,結果を行ごとに,あるいは一度に数行ずつ取得し,それぞれの行を別々に,あるいは小さなグループごとに処理する方が望ましいことがある.この機能は DatabaseLink のSQL結果セット関数に含まれている.
結果セットの基本的な操作
結果セットを操作するには,まず結果セットを作り,そこから読み込み,最後に閉じる.このセクションでは結果セットの基本的な操作について取り上げる.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように
パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
基本的な結果セット関数
SQLResultSetOpenの引数はSQLSelectまたはSQLExecuteを使ってデータを選択する関数である.以下に例を示す.
まず DatabaseLink をロードしてpublisher例題データベースに接続する.
この接続を使って表ROYSCHEDから8行読み込む.
Out[36]//TableForm= |
| |  |
同じクエリから結果セットを取得することもできる.
| Out[37]= |  |
SQLResultSetReadは結果セットから読み込み,その行を返す.結果セットから読み込んだ後は,引き続き次の行を読む.次の例では,1行だけ読み込む.結果は作られたばかりなので最初の行だけが読まれる.
| Out[5]= |  |
次は2行目と3行目を読む.
| Out[6]= |  |
デフォルトでは,SQLResultSetReadはデータ型をさまざまな Mathematica 式にマップする.しかし,オプション
をTrueに設定すると,結果は文字列式となる.
Out[7]//InputForm= |
| |  |
各行を別々に処理したい場合は,次の式のように行う.これは残りの行を読み込んで,各行の最後の要素を足し合せる.結果セットには8行あり,4行がすでに読み込まれているので,この操作では4行が読まれる.SQLResultSetReadがリスト以外のものを返したら,結果セットの最後まで到達したことが分かる.
| Out[9]= |  |
SQLResultSetReadをもう一度呼び出すと,結果セットは最後まで到達しているので,Nullが返される.
結果セットとSQL接続を閉じます.
SQLResultSetのオプション
SQLResultSetOpenは,結果セット内の動きと,結果がデータベースの変更を反映するかどうかを指定するオプション
を取る.
まず,DatabaseLink パッケージをロードし,publisher例題データベースへの接続を開始する.
結果セットを開くが,これは前に進むことのみが可能である.
| Out[3]= |  |
| |
| "ForwardOnly" | 前進のみが可能 |
| "ScrollInsensitive" | 前後に移動でき,結果セットはデータベースへの変更を反映しない |
| "ScrollSensitive" | 前後に移動でき,結果セットはデータベースへの変更を反映する |
SQLResultSetOpenの
オプションの設定
オプションを
に設定すると,結果セット内を前進することのみが可能となり,また結果セットが作られた後はデータベースの変更は反映されない.
オプションを
に設定すると,結果セット内を前後に移動でき,また結果セットが作られた後はデータベースの変更は反映されない.
オプションを
に設定すると,結果セット内を前後に移動でき,また結果セットが作られた後でもデータベースのあらゆる変更が反映される.
すべてのデータベースが結果セット内での後進やデータの変更の検出をサポートしているわけではないことに注意されたい.
また,結果セットが作られた後のオプションの変更にはSetOptionsを使う.以下のオプションは,結果セットから結果が取り出される方向を設定する.これは,ドライバによるデータの取出しの最適化を手助けする.
| |
| "FetchDirection" | 行が処理される方向についてのヒントを与える |
| "FetchSize" | データベースから取り出される行数についてのヒントを与える |
のオプション
結果セットの位置
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように
パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
結果セットの位置関数
結果セットはデータベースクエリから作られ,クエリに対応する行の配列として得られる.配列には2つの追加の位置があり,一つは1行目の前,もう一つは最終行の後である.結果セットが作られると,現在位置は最初の行の前となる.
DatabaseLink をロードし,publisherデータベースへのクエリから結果セットを作る.
| Out[40]= |  |
現在位置は0,つまり最初の行の前となる.
| Out[41]= |  |
現在位置において読込みが行われると,最初の行の前には読み込めるものが何もないので,結果は$Failedとなる.
| Out[42]= |  |
次は結果セットを2だけシフトする.結果としてTrueが得られる.これは新しい位置において読み込めるものが存在することを意味している.
| Out[43]= |  |
結果セットは2行目になった.
| Out[44]= |  |
次は現在位置の行を読む.
| Out[45]= |  |
SQLResultSetCurrentは,デフォルトではデータ型をさまざまな Mathematica 式にマップする.しかし,オプション
をTrue に設定すると,結果は文字列式となる.
Out[46]//InputForm= |
| |  |
8行目に移動します.結果はTrueとなる.これはそこに読み込めるものが存在していることを表している.
| Out[47]= |  |
結果セットの最後の行を読む.
| Out[48]= |  |
1だけシフトすると,結果はFalseとなる.これは,その位置では読み込むものが存在しないことを表している.
| Out[49]= |  |
現在の位置は9で,これは最後の行の後を表している.
| Out[50]= |  |
読込みを実行すると,最後の行の後には読み込めるものが存在しないために,結果は$Failedとなる.
| Out[51]= |  |
SQLResultSetShift
は負のシフトも行える.結果セットが後ろ向きにシフトできる場合は,後ろ向きにシフトされる.
SQLResultSetGoto
も負の設定が可能である.これらのシフトは結果セットの最後から数えるように解釈される.次の表にさまざまな引数の使い方についてまとめる.
結果セットの位置関数の例
結果セットとSQL接続を閉じる.
SQLResultSetRead[rs]はSQLResultSetShift[rs, 1];SQLResultSetCurrent[rs]と同じ働きをする.
結果セットの高度な操作
このセクションでは結果セットの高度な操作について述べる.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように
パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
高度な結果セット関数
DatabaseLink をロードし,publisherデータベースへのクエリから結果セットを作る.
| Out[56]= |  |
結果セットに含まれる行を示す.
Out[4]//TableForm= |
| |  |
2行目から4行目までを取り出す.
| Out[5]= |  |
読み込んだ後は,位置は4行目になる.
| Out[6]= |  |
SQLResultSetTakeは結果セットの最後から取り出すこともできる.次の例では,結果セットの最後の3行を読む.
| Out[7]= |  |
| Out[8]= |  |
SQLResultSetReadは負の数も取れる.これは位置を1つだけ左シフトして読むという動作を,要求された数が読まれるまで繰り返す.次の例では,結果セットの最後まで行き,その前の4行を読む.
| Out[10]= |  |
読込み後の現在位置は最後に読んだものの位置となる.
| Out[11]= |  |
SQLResultSetTakeは,デフォルトではデータ型をさまざまな Mathematica 式にマップする.しかし,オプション
をTrueに設定すると,結果は文字列式となる.
Out[12]//InputForm= |
| |  |
最後に,SQLResultSetColumnNamesを使って結果セットの列名を得る.
| Out[13]= |  |
結果セットとSQL接続を閉じる.
結果セットの例
このセクションでは,結果セット操作の一般的な例を取り上げる.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように
パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
| Out[61]= |  |
結果セットに含まれる行を示す.
Out[4]//TableForm= |
| |  |
よく行われる操作の一つに,1度に1行ずつすべての行について操作を繰り返すというものがある.以下の例では,各行の最後の要素を足し合せる.
| Out[6]= |  |
結果セットの最初の位置に移動する.
| Out[7]= |  |
ReapとSowでフォーマットする.
| Out[8]= |  |
結果セットとSQL接続を閉じる.