ラージ・オブジェクト (LOB)

ラージ・オブジェクト および総称頭字語である LOB は、 BLOB、CLOB、または DBCLOB のデータ・タイプを参照するときに使用されます。 Unicode データベースでは、NCLOB を DBCLOB の同義語として使用できます。

可変長文字ストリングで説明されているように、LOB 値には制約事項があります。 このような制限は、LOB ストリングの長さ属性が 254 バイト以下であっても適用されます。

LOB 値は非常に大きいので、 この値をデータベース・サーバーからクライアント・アプリケーション・プログラムのホスト変数に転送するには多くの時間がかかります。 アプリケーションが一度に処理するのは通常は LOB 値の全体ではなく小さな部分だけなので、 アプリケーションはラージ・オブジェクト・ロケーターを使用して LOB を参照できます。

ラージ・オブジェクト・ロケーター つまり LOB ロケーターは、 データベース・サーバーの単一 LOB 値を表す値を伴うホスト変数です。

アプリケーション・プログラムは LOB ロケーターに LOB 値を選択できます。 その後、アプリケーション・プログラムは LOB ロケーターを使用して、 そのロケーター値を入力として指定することによって、 その LOB 値に対するデータベース操作 (スカラー関数 SUBSTR、 CONCAT、VALUE、LENGTH の適用、割り当ての実行、 LIKE または POSSTR による LOB の探索、LOB に対するユーザー定義関数の適用など) を要求することができます。 出力結果 (クライアントのホスト変数に割り当てられるデータ) は、 多くの場合、入力 LOB 値の小さいサブセットとなります。

LOB ロケーターは、基本値以外のものを表現する場合もあり、 LOB 式に対応する値を表現することができます。 例えば、LOB ロケーターで、次の式に対応する値を表現できます。
   SUBSTR(lob_value_1 CONCAT lob_value_2 CONCAT lob_value_3, 42, 6000000)
そのホスト変数に NULL 値が選択されている場合、 標識変数は値が NULL 値であることを示す -1 に設定されます。 しかし、LOB ロケーターの場合は、標識変数の意味が少し違います。 ロケーター・ホスト変数自体は NULL 値にすることができないので、 標識変数の負の値は、その LOB ロケーターが表す LOB 値が NULL 値であることを示します。 標識変数の値により、NULL 値情報はクライアントにとってローカルに保持されます。サーバー側では有効なロケーターによって NULL 値を追跡しません。

LOB ロケーターが表すのは 1 つの値であって、 データベースの行やロケーションを表すわけではない、ということは重要です。 値がロケーターに選択されると、 ロケーターが参照する値に影響を及ぼすような操作を、 元の行や表に対して実行することはできません。 ロケーターに対応する値は、トランザクションが終了するか、 ロケーターが明示的に解放されるか、どちらかが行われるまで有効です。 ロケーターでは、この機能を実現するために、追加でデータのコピーなどを行ったりはしません。 その代わりに、ロケーター・メカニズムに基本 LOB 値の内容が保管されます。 LOB 値 (または、上記のような LOB の式) のマテリアライズは、LOB 値が実際に何らかの位置に割り当てられるまで据え置かれます。すなわち、ホスト変数の形式でユーザー・バッファーに割り当てられるか、もしくはデータベースの別のレコードに割り当てられるまでです。

LOB ロケーターは、トランザクションの中で LOB 値を参照するための唯一のメカニズムです。 LOB ロケーターはそれが作成されたトランザクションを超えて存続することはありません。 これはデータベース・タイプではなく、 データベースに保管されることはありません。 したがって、ビューやチェック制約には加わりません。 しかし、LOB ロケーターは LOB タイプのクライアント側の表現なので、 FETCH、OPEN、または EXECUTE ステートメントで使用される SQLDA 構造の中で記述されるよう、 LOB ロケーターの SQLTYPE が用意されています。