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