アプリケーションがラージ・オブジェクト値を選択してその部分に関する操作を行う必要があるが、 その値全体をデータベース・サーバーからアプリケーションのメモリーへ転送する必要がなかったり、 転送したくないような場合がよくあります。 このような場合、 アプリケーションでラージ・オブジェクト・ロケーター (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 値のスナップショットです。 カーソルの現在位置と LOB 値が抽出された行との間には、何の関連もありません。 このことは、カーソルが異なる行へ移動した後でも、 LOB ロケーター (および LOB ロケーターが表す値) が、まだ参照できることを意味します。
INSERT INTO lobtable values (CAST ? AS CLOB(4k) || CAST ? AS CLOB(5k))
VALUES (SUBSTR(:locator, :offset, :length))