CLI を介したデータの部分検索

ユーザーが 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
            : 
    }