結果セット

データベースクエリにより,多くの行のデータが返されると,結果を保持するのに非常に多量のメモリが必要となることがある.データの処理において一度にすべてのデータが必要なわけではない場合は,結果を行ごとに,あるいは一度に数行ずつ取得し,それぞれの行を別々に,あるいは小さなグループごとに処理する方が望ましいことがある.この機能は DatabaseLink のSQL結果セット関数に含まれている.

結果セットの基本的な操作

結果セットを操作するには,まず結果セットを作り,そこから読み込み,最後に閉じる.このセクションでは結果セットの基本的な操作について取り上げる.

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているようにパッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

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例題データベースに接続する.

In[34]:=
Click for copyable input

この接続を使って表ROYSCHEDから8行読み込む.

In[36]:=
Click for copyable input
Out[36]//TableForm=

同じクエリから結果セットを取得することもできる.

In[37]:=
Click for copyable input
Out[37]=

SQLResultSetReadは結果セットから読み込み,その行を返す.結果セットから読み込んだ後は,引き続き次の行を読む.次の例では,1行だけ読み込む.結果は作られたばかりなので最初の行だけが読まれる.

In[5]:=
Click for copyable input
Out[5]=

次は2行目と3行目を読む.

In[6]:=
Click for copyable input
Out[6]=

デフォルトでは,SQLResultSetReadはデータ型をさまざまな Mathematica 式にマップする.しかし,オプションTrueに設定すると,結果は文字列式となる.

In[7]:=
Click for copyable input
Out[7]//InputForm=

各行を別々に処理したい場合は,次の式のように行う.これは残りの行を読み込んで,各行の最後の要素を足し合せる.結果セットには8行あり,4行がすでに読み込まれているので,この操作では4行が読まれる.SQLResultSetReadがリスト以外のものを返したら,結果セットの最後まで到達したことが分かる.

In[8]:=
Click for copyable input
Out[9]=

SQLResultSetReadをもう一度呼び出すと,結果セットは最後まで到達しているので,Nullが返される.

In[10]:=
Click for copyable input

結果セットとSQL接続を閉じます.

In[11]:=
Click for copyable input

SQLResultSetのオプション

SQLResultSetOpenは,結果セット内の動きと,結果がデータベースの変更を反映するかどうかを指定するオプションを取る.

まず,DatabaseLink パッケージをロードし,publisher例題データベースへの接続を開始する.

In[1]:=
Click for copyable input

結果セットを開くが,これは前に進むことのみが可能である.

In[3]:=
Click for copyable input
Out[3]=
詳細
詳細
"ForwardOnly"前進のみが可能
"ScrollInsensitive"前後に移動でき,結果セットはデータベースへの変更を反映しない
"ScrollSensitive"前後に移動でき,結果セットはデータベースへの変更を反映する

SQLResultSetOpenオプションの設定

オプションをに設定すると,結果セット内を前進することのみが可能となり,また結果セットが作られた後はデータベースの変更は反映されない.

オプションをに設定すると,結果セット内を前後に移動でき,また結果セットが作られた後はデータベースの変更は反映されない.

オプションをに設定すると,結果セット内を前後に移動でき,また結果セットが作られた後でもデータベースのあらゆる変更が反映される.

すべてのデータベースが結果セット内での後進やデータの変更の検出をサポートしているわけではないことに注意されたい.

また,結果セットが作られた後のオプションの変更にはSetOptionsを使う.以下のオプションは,結果セットから結果が取り出される方向を設定する.これは,ドライバによるデータの取出しの最適化を手助けする.

In[4]:=
Click for copyable input
設定
詳細
"FetchDirection"行が処理される方向についてのヒントを与える
"FetchSize"データベースから取り出される行数についてのヒントを与える

のオプション

結果セットの位置

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているようにパッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

SQLResultSetShift[rs,num]結果セット rs における現在の位置を num シフトする
SQLResultSetGoto[rs,num]結果セット rs における現在の位置を num に移動する
SQLResultSetPosition[rs]結果セット rs における現在の位置を返す
SQLResultSetCurrent[rs]結果セット rs の現在位置の行を読む

結果セットの位置関数

結果セットはデータベースクエリから作られ,クエリに対応する行の配列として得られる.配列には2つの追加の位置があり,一つは1行目の前,もう一つは最終行の後である.結果セットが作られると,現在位置は最初の行の前となる.

DatabaseLink をロードし,publisherデータベースへのクエリから結果セットを作る.

In[38]:=
Click for copyable input
Out[40]=

現在位置は0,つまり最初の行の前となる.

In[41]:=
Click for copyable input
Out[41]=

現在位置において読込みが行われると,最初の行の前には読み込めるものが何もないので,結果は$Failedとなる.

In[42]:=
Click for copyable input
Out[42]=

次は結果セットを2だけシフトする.結果としてTrueが得られる.これは新しい位置において読み込めるものが存在することを意味している.

In[43]:=
Click for copyable input
Out[43]=

結果セットは2行目になった.

In[44]:=
Click for copyable input
Out[44]=

次は現在位置の行を読む.

In[45]:=
Click for copyable input
Out[45]=

SQLResultSetCurrentは,デフォルトではデータ型をさまざまな Mathematica 式にマップする.しかし,オプションTrue に設定すると,結果は文字列式となる.

In[46]:=
Click for copyable input
Out[46]//InputForm=

8行目に移動します.結果はTrueとなる.これはそこに読み込めるものが存在していることを表している.

In[47]:=
Click for copyable input
Out[47]=

結果セットの最後の行を読む.

In[48]:=
Click for copyable input
Out[48]=

1だけシフトすると,結果はFalseとなる.これは,その位置では読み込むものが存在しないことを表している.

In[49]:=
Click for copyable input
Out[49]=

現在の位置は9で,これは最後の行の後を表している.

In[50]:=
Click for copyable input
Out[50]=

読込みを実行すると,最後の行の後には読み込めるものが存在しないために,結果は$Failedとなる.

In[51]:=
Click for copyable input
Out[51]=

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 の最後の行の後に移動する

結果セットの位置関数の例

結果セットとSQL接続を閉じる.

In[52]:=
Click for copyable input

SQLResultSetRead[rs]SQLResultSetShift[rs, 1];SQLResultSetCurrent[rs]と同じ働きをする.

結果セットの高度な操作

このセクションでは結果セットの高度な操作について述べる.

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているようにパッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

SQLResultSetTake[rs,spec]指定 spec を使って結果セット rs から読み込む
SQLResultSetRead[rs,-num]結果セット rs における位置を num 個にシフトする
SQLResultSetColumnNames[rs]結果セット rs の列の名前を返す

高度な結果セット関数

DatabaseLink をロードし,publisherデータベースへのクエリから結果セットを作る.

In[54]:=
Click for copyable input
Out[56]=

結果セットに含まれる行を示す.

In[4]:=
Click for copyable input
Out[4]//TableForm=

2行目から4行目までを取り出す.

In[5]:=
Click for copyable input
Out[5]=

読み込んだ後は,位置は4行目になる.

In[6]:=
Click for copyable input
Out[6]=

SQLResultSetTakeは結果セットの最後から取り出すこともできる.次の例では,結果セットの最後の3行を読む.

In[7]:=
Click for copyable input
Out[7]=
In[8]:=
Click for copyable input
Out[8]=

SQLResultSetReadは負の数も取れる.これは位置を1つだけ左シフトして読むという動作を,要求された数が読まれるまで繰り返す.次の例では,結果セットの最後まで行き,その前の4行を読む.

In[9]:=
Click for copyable input
Out[10]=

読込み後の現在位置は最後に読んだものの位置となる.

In[11]:=
Click for copyable input
Out[11]=

SQLResultSetTakeは,デフォルトではデータ型をさまざまな Mathematica 式にマップする.しかし,オプションTrueに設定すると,結果は文字列式となる.

In[12]:=
Click for copyable input
Out[12]//InputForm=

最後に,SQLResultSetColumnNamesを使って結果セットの列名を得る.

In[13]:=
Click for copyable input
Out[13]=

結果セットとSQL接続を閉じる.

In[57]:=
Click for copyable input

結果セットの例

このセクションでは,結果セット操作の一般的な例を取り上げる.

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているようにパッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

In[59]:=
Click for copyable input
Out[61]=

結果セットに含まれる行を示す.

In[4]:=
Click for copyable input
Out[4]//TableForm=

よく行われる操作の一つに,1度に1行ずつすべての行について操作を繰り返すというものがある.以下の例では,各行の最後の要素を足し合せる.

In[5]:=
Click for copyable input
Out[6]=

結果セットの最初の位置に移動する.

In[7]:=
Click for copyable input
Out[7]=

ReapSowでフォーマットする.

In[8]:=
Click for copyable input
Out[8]=

結果セットとSQL接続を閉じる.

In[62]:=
Click for copyable input
New to Mathematica? Find your learning path »
Have a question? Ask support »