DB2 Version 9.7 for Linux, UNIX, and Windows

CLI アプリケーションでの LOB ロケーター

アプリケーションがラージ・オブジェクト値を選択してその部分に関する操作を行う必要があるが、 その値全体をデータベース・サーバーからアプリケーションのメモリーへ転送する必要がなかったり、 転送したくないような場合がよくあります。 このような場合、 アプリケーションでラージ・オブジェクト・ロケーター (LOB ロケーター) を使って個々の LOB 値を参照することができます。

LOB ロケーターは、タイプ SQLINTEGER として定義される、 ラージ・オブジェクトに効率よくランダム・アクセスするためのトークン値です。 LOB ロケーターを使用すると、サーバーは照会を実行し、 結果セット中に LOB 列の値を入れる代わりに、 LOB の値に対応する整数で LOB ロケーターを更新します。 その後アプリケーションが結果を要求する際にはサーバーにロケーターを渡し、 サーバーは LOB 結果を返します。

LOB ロケーターはデータベース中に保管されません。 LOB ロケーターはトランザクション中に LOB 値を参照し、 作成されたトランザクションを越えて持続することはありません。 LOB ロケーターは単純なトークン値で、行中の列ではなく、 1 つのラージ・オブジェクト を参照するために作成されます。 行に保管されている元の LOB 値に有効なロケーターについては、実行できる操作はありません。

3 つの LOB ロケーター・タイプのそれぞれには、 独自の C データ・タイプ (SQL_C_BLOB_LOCATOR、SQL_C_CLOB_LOCATOR、 SQL_C_DBCLOB_LOCATOR) があります。 これらのタイプを使用すると、 データベース・サーバーとの間で LOB ロケーター値を転送できるようになります。

次のことを行うと、ロケーターが暗黙割り振りされます。

CLI アプリケーションでは、LOB データを取り出すステートメントでは、デフォルトで、LOB 値を参照する LOB ロケーターとともに行データが戻されます。適切なサイズのバッファーが LOB 列にバインドされている場合、LOB 値は、LOB ロケーターとしてではなくバッファーで戻されます。

正規のデータ・タイプと LOB ロケーターとの間の違い

LOB ロケーターは、一般に他の任意のデータ・タイプとして処理できますが、 次のような重要な相違点があります。
  • ロケーターがサーバーで生成されるのは、行がフェッチされ、 かつ LOB ロケーター C データ・タイプが SQLBindCol() に指定されているか、 または SQLGetSubString() が呼び出されて別の LOB の一部にロケーターを定義している場合です。 アプリケーションに転送されるのはロケーターだけです。
  • ロケーターの値は、現行トランザクション内だけで有効です。 LOB をフェッチするために使用するカーソルに WITH HOLD 属性があるとしても、ロケーター値を保管したり、 現行のトランザクションを越えてロケーター値を使用したりすることはできません。
  • FREE LOCATOR ステートメントを使用して、 トランザクションの終了前にロケーターを解放することもできます。
  • ロケーターが受信されると、アプリケーションは SQLGetSubString() を使用して、 LOB 値の一部を受信するか、またはサブストリングを表す別のロケーターを生成することができます。 ロケーターの値は、パラメーター・マーカーの入力としても使用できます (SQLBindParameter() を使用)。

    LOB ロケーターは、データベース位置を指すポインターではなく、 LOB 値への参照、つまり LOB 値のスナップショットです。 カーソルの現在位置と LOB 値が抽出された行との間には、何の関連もありません。 このことは、カーソルが異なる行へ移動した後でも、 LOB ロケーター (および LOB ロケーターが表す値) が、まだ参照できることを意味します。

  • SQLGetPosition()SQLGetLength() は、 サブストリングを定義する際に SQLGetSubString() とともに使用することができます。
結果セット内の特定の LOB 列の場合、以下の対象をバインドすることができます。
  • 全 LOB データ値を保持するストレージ・バッファー、
  • LOB ロケーター、または
  • LOB ファイル参照 (SQLBindFileToCol() を使用)。

LOB ロケーターの使用例

LOB ロケーターも、 データベース中の表のある列のデータを (同じまたは異なる表の) 別の列に移動するときに、 そのデータを一度アプリケーション・メモリーに取り出してからサーバーに送り返す必要がなく、 便利な方法です。 次の INSERT ステートメントは、ロケーターによって表される 2 つの LOB 値が連結された 1 つの LOB 値を挿入します。
INSERT INTO lobtable values (CAST ? AS CLOB(4k) || CAST ? AS CLOB(5k))
CLI アプリケーションは、次の VALUES ステートメントを使用して、LOB 値を分割して取得することもできます。
VALUES (SUBSTR(:locator, :offset, :length))