CLI の手引きおよび解説書

長形式データの分割送信 / 取り出し

長形式データを扱う場合、ステートメントを実行する時、またはデータをデータベースから取り出す時に、アプリケーションがデータ全体を記憶域にロードするのは合理的ではないことがあります。そこでアプリケーションがデータを小さく分けて扱えるような方法が備えられています。長データを分けて送信する手法は、 実行時パラメーター値の指定 と呼ばれます。これは、整数などの固定サイズの非文字データ・タイプの値を指定する場合にも使用できるからです。

また、アプリケーションは SQLGetSubString() 関数を使用して、ラージ・オブジェクト値の一部分を検索することができます。詳細については、ラージ・オブジェクトの使用図 16 を参照してください。

実行時パラメーター値の指定

SQLExecute() または SQLExecDirect() を呼び出す前に値がメモリーに保管されるのではなく、実行時に値がプロンプト指示されるバインド済みパラメーターのことを実行時データ・パラメーターと呼びます。 SQLBindParameter() 呼び出しでそのようなパラメーターを指定するには、アプリケーションは次のようにします。

アプリケーションが SQLExecDirect() または SQLExecute() を呼び出したときに実行時パラメーターがあれば、呼び出しは SQL_NEED_DATA とともに返され、これらのパラメーターにアプリケーションが値を入れるよう入力を要求します。アプリケーションは次のように応答します。

  1. SQLParamData() を呼び出して、最初の実行時データ・パラメーターへ概念的に進みます。 SQLParamData() は SQL_NEED_DATA を返し、関連したSQLBindParameter() 呼び出しで指定されている入力データ・ポインター引き数の内容を示して、必要な情報を識別するのを助けます。
  2. SQLPutData() を呼び出して、パラメーターの実際のデータを渡します。 SQLPutData() を繰り返し呼び出すと、長いデータを小さく分けて送信することができます。
  3. この実行時データ・パラメーターに関するデータ全体を渡した後で、再度 SQLParamData() を呼び出します。他に実行時データ・パラメーターがある場合は、 SQLParamData() は再度 SQL_NEED_DATA を返し、アプリケーションは上記のステップ 2 および 3 を繰り返します。

すべての実行時データ・パラメーターに値が割り当てられると、 SQLParamData() は SQL ステートメントの実行を完了し、元々 SQLExecDirect() または SQLExecute() が作成するはずであった戻り値および診断を作成します。 図 9 の右側にこの流れを図示してあります。

実行時データ・フローが進んでいる間は、アプリケーションは次の DB2 CLI 関数だけ呼び出せます。

実行時パラメーターの手法を使用してラージ・オブジェクト・データを入力する際に、クライアントで一時ファイルを作成して使用することが必要となる場合があります。長形式データを入力する他の方式については、ラージ・オブジェクトの使用を参照してください。

データの分割取り出し

一般にアプリケーションは、結果セットの列に関する知識 (SQLDescribeCol() によって得た知識か、または以前の知識) に基づいて、列の値が使う可能性のある最大メモリーを割り振るよう選択し、その列を SQLBindCol() によってバインドします。しかし、文字および 2 進データの場合、列の長さが不定であることがあります。列値の長さが、アプリケーションが割り振る (または割り振れる) バッファーの長さを超えている場合に、 SQLGetData() の機能を使用すると、アプリケーションが繰り返して呼び出しを行い、 1 つの列の値を管理しやすい大きさに分けて連続して得ることができます。

基本的には、図 9 の左側に示したように、 SQLGetData() を呼び出すと SQL_SUCCESS_WITH_INFO (および SQLSTATE 01004) が返され、この列に関するデータがさらに存在することを示します。 SQLGetData() が繰り返して呼び出され、 SQL_SUCCESS が返されるまでデータの残りの部分を獲得します。 SQL_SUCCESS は、この列に関するデータ全体が取り出されたことを知らせるものです。

また、関数 SQLGetSubString() を使用して、ラージ・オブジェクト値の特定部分を検索することができます。詳細については、SQLGetSubString - ストリング値の部分を取り出すを参照してください。長形式データを取り出す他の方式については、ラージ・オブジェクトの使用を参照してください。

図 9. 分割入力および取り出し


分割入力および取り出し

分割入力および取り出しの例

イメージ blob の分割入力の例については、 CLI サンプル dtlob.cpicin2.c を参照してください。

イメージ blob の分割取り出しの例については、 CLI サンプル tbread.cshowpic2.c を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]