ラージ・オブジェクト という用語および総称頭字語の LOB は、任意のタイプのラージ・オブジェクトを指して呼ぶのに使われます。 3 つの LOB データ・タイプがあります。それは 2 進ラージ・オブジェクト (BLOB)、文字ラージ・オブジェクト (CLOB)、および 2 バイト文字ラージ・オブジェクト (DBCLOB) です。これらの LOB データ・タイプは記号でそれぞれ、SQL_BLOB、 SQL_CLOB、SQL_DBCLOB と表されます。 表 2 のリストには 3 つの LOB データ・タイプ、それに対応する記号名、および省略時の C 記号名の項目があります。 SQL データ・タイプ引き数を受け入れたり返したりする DB2 CLI 関数 (SQLBindParameter()、 SQLDescribeCol() など) の場合は、LOB 記号定数を指定したり返したりすることができます。
LOB 値は非常に大きいことがあるので、 SQLGetData() および SQLPutData() による分割の順次方式を使用してデータを転送すると、非常に時間がかかる可能性があります。この種のデータを扱うアプリケーションの場合、普通はセグメント単位で、または直接ファイル入出力を使って転送を行います。
アプリケーションがラージ・オブジェクト値を選択してその部分に関する操作を行う必要があるが、その値全体をデータベース・サーバーからアプリケーションのメモリーへ転送する必要がなかったり、転送したくないような場合がよくあります。このような場合、アプリケーションでラージ・オブジェクト・ロケーター (LOB ロケーター) を使って個々の LOB 値を参照することができます。
LOB ロケーターは 1 つの機構で、アプリケーション・プログラムがラージ・オブジェクト値をランダム・アクセス方法によって効率的に操作できるようにするものです。 LOB ロケーターとは実行時の概念で、持続タイプではなく、データベースに保管もされません。これはトランザクション中に LOB 値を参照するために使用する機構で、作成されたトランザクションを越えて持続することはありません。 3 つの LOB ロケーター・タイプのそれぞれには、独自の C データ・タイプ (SQL_C_BLOB_LOCATOR、SQL_C_CLOB_LOCATOR、 SQL_C_DBCLOB_LOCATOR) があります。これらのタイプを使用すると、データベース・サーバーとの間で LOB ロケーター値を転送できるようになります。
LOB ロケーターは、1 つの LOB 値を表す単純なトークン値です。ロケーターは、レコード内のフィールドを参照するためではなく、ラージ・オブジェクト値 を参照するために作成されます。行に保管されている元の LOB 値に有効なロケーターについては、実行できる操作はありません。アプリケーションは、 LOB ロケーターをアプリケーション変数中に (SQLBindCol() または SQLGetData() 関数を使用して) 取り出してから、そのロケーターによって関連付けられている LOB 値に次の DB2 CLI 関数を適用することができます。
次のことを行うと、ロケーターが暗黙割り振りされます。
LOB ロケーターも、サーバーの表のある列のデータを (同じまたは異なる表の) 別の列に移動するときに、そのデータを一度アプリケーション・メモリーに取り出してからサーバーに送り返す必要がなく、便利な方法です。たとえば、次の INSERT ステートメントは、ロケーターによって表される 2 つの LOB 値が連結された 1 つの LOB 値を挿入します。
INSERT INTO lobtable values (CAST ? AS CLOB(4k) || CAST ? AS CLOB(5k))
FREE LOCATOR ステートメントを実行して、トランザクションの終了前にロケーターを明示的に解放することができます。構文を次に示します。
>>-FREE LOCATOR--?---------------------------------------------><
このステートメントは動的に準備することはできませんが、 DB2 CLI はこれを SQLPrepare() および SQLExecDirect() にとって有効なステートメントとして受け入れます。アプリケーションは、 SQL データ・タイプ引き数を適切な SQL および C 記号データ・タイプ (表 2 を参照) に設定して、 SQLBindParameter() を使用します。
もう一つの方法として、アプリケーションで LOB 列値全体が必要な場合に、 LOB に関する直接ファイル入出力を要求することができます。データベースの照会、更新、および挿入には、 1 つ 1 つの LOB 列値をファイルとの間でやりとりすることが含まれています。 DB2 CLI LOB ファイル・アクセス関数には、以下の 2 つがあります。
ファイル名は、ファイルの完全パス名 (これをお勧めします) か、相対ファイル名のいずれかです。相対ファイル名が指定されると、クライアント・プロセスの (操作環境の) 現行パスにその名前が追加されます。実行または取り出しの際に、ファイルとの間のデータ転送は、バインド済みアプリケーション変数の場合と同様に行われます。これら 2 つの関数に関連づけられているファイル・オプション引き数は、転送時にファイルを処理する方法を指定します。
SQLBindFileToParam() を使用する方が、 SQLPutData() を使用してデータ・セグメントを順次入力するよりも効率的です。 SQLPutData() の場合は入力セグメントを一時ファイルへ完全に挿入してから、 SQLBindFileToParam() 手法を使って LOB データ値をサーバーへ送信するからです。アプリケーションで SQLPutData() を使用する代わりに SQLBindFileToParam() を活用することをお勧めします。
SQL_LONGVARCHAR を使用して文字ラージ・オブジェクト・データを参照し、 SQL_LONGVARBINARY を使用して 2 進ラージ・オブジェクト・データを参照する総称 ODBC アプリケーションを作成する場合の詳細については、 付録 C, DB2 CLI と ODBC を参照してください。
現在すべての DB2 サーバーでラージ・オブジェクトがサポートされている訳ではありません。いずれかの LOB 関数が現行のサーバーでサポートされているかどうかを判別するには、該当する関数名の引き数値を指定して SQLGetFunctions() を呼び出してください。
図 16 は、文字 LOB (CLOB) の取り出しを示しています。
LOB ロケーターが取り出され、次いでこのロケーターがサブストリングの CLOB を探索するための入力パラメーターとして使用されて、サブストリングが検索されます。
ファイルはまず CLOB 列にバインドされ、行が取り出されると、 CLOB 値全体が直接ファイルに転送されます。
![]() |
次の例では、EMP_RESUME 表の Resume CLOB 列から "Interests" セクションを抽出します。サブストリングだけがアプリケーションに転送されます。
/* From the CLI sample dtlob.c */ /* ... */ /* get the starting postion of the CLOB piece of data */ sqlrc = SQLGetPosition( hstmtLocUse, SQL_C_CLOB_LOCATOR, clobLoc, 0, ( SQLCHAR * ) "Interests", strlen( "Interests"), 1, &clobPiecePos, &ind ) ;
既存の ODBC アプリケーションは、 DB2 の BLOB および CLOB データ・タイプの代わりに SQL_LONGVARCHAR および SQL_LONGVARBINARY を使用します。 LONGDATACOMPAT キーワードを初期設定ファイルに設定するか、または SQLSetConnectAttr() を使用して SQL_ATTR_LONGDATA_COMPAT 接続属性を設定することにより、 DB2 CLI は ODBC 長形式データ・タイプを DB2 LOB データ・タイプにマッピングします。
このマッピングが有効になると、次のようになります。
SQL_ATTR_LONGDATA_COMPAT の省略時設定は、SQL_LD_COMPAT_NO です。マッピングは有効ではありません。
詳細については、構成キーワードおよび SQLSetConnectAttr - 接続属性を設定するを参照してください。
マッピングが有効になると、ODBC アプリケーションは SQLGetData()、 SQLPutData()、および関連関数を使用して LOB データを取り出すことができます。データの分割挿入や分割取り出しの詳細については、長形式データの分割送信 / 取り出しを参照してください。
注: | DB2 CLI は、LOB データを分けて挿入するときに一時ファイルを使用します。データが元々ファイルにある場合は、SQLBindFileToParam() を使用して、一時ファイルを使用しないようにすることができます。 SQLGetFunctions() を呼び出して、 SQLBindFileToParam() のサポートがあるかどうかを照会してください。 |