ユーザーが CLI を介して DB2 Everyplace テーブルからデータを 検索する方法には、以下の 2 つの方法があります。
バイナリー・データ (BLOB) または文字データ (CHAR や VARCHAR) の場合、列は非常に長くなる 可能性があります。アプリケーション開発者は、列全体を保持するだけのバッファーを割り振りたくないか、または これだけのバッファーを割り振る余裕がないことがあります。加えて、アプリケーションでは、列の一部分だけしか 必要としない場合もあります。このような場合に、データの断片検索が必要となります。
手順
SQLGetData() の 1 つの機能により、アプリケーションは反復呼び出しを使用して、1 つの列の値を扱いやすい大きさに分けて順番に取得できます。実際、SQLGetData() を呼び出すと、SQL_SUCCESS_WITH_INFO (SQLSTATE 01004 付き) が戻され、この列にさらにデータがあることを示します。この列のデータ全体が検索されたことを示す SQL_SUCCESS が戻されるまで、SQLGetData() が繰り返し呼び出されます。
構文
SQLRETURN SQLGetData (
SQLHSTMT StatementHandle, /* hstmt */
SQLUSMALLINT ColumnNumber, /* icol */
SQLSMALLINT TargetType, /* fCType */
SQLPOINTER TargetValuePtr, /* rgbValue */
SQLINTEGER BufferLength, /* cbValueMax */
SQLINTEGER *FAR StrLen_or_IndPtr); /* pcbValue */
この場合、一度に BufferLength バイトが検索され、StrLen_or_IndPtr は残りの バイト数を示します。残りのバイトが ある場合、関数の戻り値は SQL_SUCCESS_WITH_INFO (SQLSTATE 01004 付き) に なります。それ以外の場合、戻り値が SQL_SUCCESS であれば、StrLen_or_IndPtr は、DB2 Everyplace CLI がデータを戻す際に使用できる TargetValuePtr バッファーのバイト数を示します。SQLGetData() をこのように使用して、C データ・タイプ (TargetType) が SQL_C_CHAR または SQL_C_BINARY の場合、あるいは TargetType が SQL_C_DEFAULT で列タイプがバイナリーまたは文字ストリングを示す場合に、長い列を検索することができます。
この SQLGetData() の機能を使用するには、まずステートメント属性 SQL_ATTR_GETDATA_MODE を SQL_PIECEMEAL_DATA に設定する必要があります。この属性のデフォルト値は、SQL_CHUNK_DATAです。これら 2 つのモードの違いは、SQL_CHUNK_DATA モード (デフォルト・モード) では、切り捨てが 発生した場合、SQLGetData() の戻り値 StrLen_or_IndPtr がこの列の 合計 バイト数を示し、2 番目の呼び出しでも列の先頭からデータを検索することです。
コード・フラグメントの例
sqlrc = SQLSetStmtAttr(hstmt, SQL_ATTR_GETDATA_MODE, (SQLPOINTER) SQL_PIECEMEAL_DATA, 0); SQLCHAR * stmt = (SQLCHAR *) "SELECT blobColumn FROM t1 where c1 = ?"; sqlrc = SQLPrepare( hstmt, stmt, SQL_NTS ) ; sqlrc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, ...); sqlrc = SQLExecute( hstmt ) ; sqlrc = SQLFetch( hstmt ); /* get BUFSIZ bytes at a time, bufInd indicates number of Bytes LEFT */ sqlrc = SQLGetData (hstmt, 1, SQL_C_BINARY, (SQLPOINTER) buffer, BUFSIZ, &bufInd); while( sqlrc == SQL_SUCCESS_WITH_INFO ) { // handle BUFSIZ bytes of blob data in buffer : sqlrc = SQLGetData (hstmt, 1, SQL_C_BINARY, (SQLPOINTER) buffer, BUFSIZ, &bufInd); } if (sqlrc == SQL_SUCCESS) { /* partial buffer on last GetData */ // handle bufInd bytes of blob data in buffer : }