Hitachi

Hitachi Advanced Data Binder AP開発ガイド


18.2.2 データを参照する場合

データの参照方法の例を説明します。ここでは,カーソルを使用した行の取り出し方法について説明します。カーソルを使用した行の取り出し方法を次の図に示します。

図18‒5 カーソルを使用した行の取り出し方法

[図データ]

各処理の詳細を次に説明します。

〈この項の構成〉

(1) 文ハンドルの確保

SQL文を実行する前に,a_rdb_SQLAllocStmt()を使用して文ハンドルを確保します。文ハンドルを確保できた場合,戻り値としてa_rdb_RC_SQL_SUCCESSが返されます。文ハンドルの確保例を次に示します。

文ハンドルの確保例
void  *hStmt ;                           /* 文ハンドルアドレス */
 
/* 文ハンドルの確保 */
rtnc = a_rdb_SQLAllocStmt(hCnct,
                          &hStmt,
                          NULL) ;

a_rdb_SQLAllocStmt()については,「19.4.1 a_rdb_SQLAllocStmt()(文ハンドルの確保)」を参照してください。

(2) SQL文の前処理

次に,「(1) 文ハンドルの確保」で取得した文ハンドルにSQL文を割り当てます。取得した文ハンドルにSQL文を割り当てるには,a_rdb_SQLPrepare()を使用してSQL文の前処理を実行します。SELECT文の前処理の例を次に示します。

SELECT文の前処理の例
/* SELECT文の前処理 */
rtnc = a_rdb_SQLPrepare(hCnct,
                        hStmt,
                        "SELECT C1,C2,C3 FROM T1",
                        NULL) ;

a_rdb_SQLPrepare()については,「19.4.14 a_rdb_SQLPrepare()(SQL文の前処理)」を参照してください。

(3) 検索結果列数の取得

動的にSQL文を実行するなど,APの作成時に検索結果列数(検索結果として出力される列の数)が確定していない場合,a_rdb_SQLNumResultCols()を使用して検索結果列数を取得します。検索結果列数の取得例を次に示します。

検索結果列数の取得例
/* 検索結果列数の取得 */
rtnc = a_rdb_SQLNumResultCols(hCnct,
                              hStmt,
                              &colCount,    /* 列数 */
                              NULL) ;

a_rdb_SQLNumResultCols()については,「19.4.13 a_rdb_SQLNumResultCols()(検索結果列数の取得)」を参照してください。

(4) 検索結果列の情報取得

動的にSQL文を実行するなど,APの作成時に検索結果列の列名,データ型,またはデータ長などの列情報が確定していない場合,a_rdb_SQLDescribeCols()を使用して検索結果列の情報を取得します。a_rdb_SQLDescribeCols()で取得できる情報を次に示します。

検索結果列の情報取得例を次に示します。

検索結果列の情報取得例
/* 検索結果列の情報の取得 */
rtnc = a_rdb_SQLDescribeCols(hCnct,
                             hStmt,
                             colCount,           /* 検索結果列数 */
                             &(colInf[0]),       /* 全検索結果列の情報返却領域 */
                             NULL) ;

a_rdb_SQLDescribeCols()については,「19.4.6 a_rdb_SQLDescribeCols()(検索結果列の情報取得)」を参照してください。

(5) 検索結果列の関連づけ

検索結果列と,検索結果列から取り出した値を格納する領域の関連づけ(検索結果列の関連づけ)を行います。検索結果列の関連づけを行うと,a_rdb_SQLFetch()を使用してカーソルを操作する際に,検索結果列の値が関連づけた領域に自動的に格納されます。

検索結果列の関連づけを行うには,a_rdb_SQLBindCols()を使用します。検索結果列の関連づけの例を次に示します。

検索結果列の関連づけの例
/* 検索結果列の関連づけ */
rtnc = a_rdb_SQLBindCols(hCnct,
                         hStmt,
                         colCount,           /* 検索結果列数 */
                         &(colInf[0]),       /* 全列割り当て格納領域 */
                         NULL) ;

a_rdb_SQLBindCols()については,「19.4.3 a_rdb_SQLBindCols()(検索結果列の関連づけ)」を参照してください。

(6) SQL文の実行(カーソルのオープン)

a_rdb_SQLExecute()を使用して,前処理したSQL文を実行します。a_rdb_SQLExecute()の引数に,実行するSQL文の文ハンドルを指定します。SQL文が正常に実行されると,戻り値としてa_rdb_RC_SQL_SUCCESSが返され,カーソルがオープンします。SQL文の実行例を次に示します。

SQL文の実行例
/* SQL文の実行 */
rtnc = a_rdb_SQLExecute(hCnct,
                        hStmt,
                        NULL) ;

a_rdb_SQLExecute()については,「19.4.9 a_rdb_SQLExecute()(前処理したSQL文の実行)」を参照してください。

(7) カーソルを使用した行の取り出し

SQL文の実行によってオープンされたカーソルを使用して行を取り出すには,a_rdb_SQLFetch()を使用します。行の取り出しが成功すると,戻り値としてa_rdb_RC_SQL_SUCCESSが返されます。カーソルを使用した行の取り出し例を次に示します。

カーソルを使用した行の取り出し例
/* カーソルを使用した行の取り出し */
rtnc = a_rdb_SQLFetch(hCnct,
                      hStmt,
                      NULL) ;

a_rdb_SQLFetch()については,「19.4.10 a_rdb_SQLFetch()(行の取り出し)」を参照してください。

(8) 取り出したデータの変換

取り出したデータが,SQLのDECIMALNUMERICBINARY型,VARBINARY型,DATE型,TIME型,またはTIMESTAMP型のデータの場合,CLI関数を使用してC言語またはC++言語の文字列データに変換できます。DECIMAL型のデータを変換する例を次に示します。

データの変換例
#define PRECISION 6
#define SCALE 3
 
unsigned char data_decimal[4];
char data_char[PRECISION+4];
 
/* DECIMAL型データを変換 */
rtnc = a_rdb_CNV_DECIMALchar(data_decimal,  /* 出力データの先頭アドレス */
                            PRECISION,      /* 出力データの精度 */
                            SCALE,          /* 出力データの位取り */
                            data_char,      /* 変換後データの格納領域アドレス */
                            (PRECISION+4),  /*変換後データの格納領域長 */
                            NULL);

(9) カーソルのクローズ

a_rdb_SQLCloseCursor()を使用して,カーソルをクローズします。カーソルのクローズ例を次に示します。

カーソルのクローズ例
/* カーソルのクローズ */
rtnc = a_rdb_SQLCloseCursor(hCnct,
                            hStmt,
                            NULL) ;

a_rdb_SQLCloseCursor()については,「19.4.5 a_rdb_SQLCloseCursor()(カーソルのクローズ)」を参照してください。

(10) 文ハンドルの解放

a_rdb_SQLFreeStmt()をして,確保した文ハンドルを解放します。文ハンドルの解放例を次に示します。

文ハンドルの解放例
/* 文ハンドルの解放 */
rtnc = a_rdb_SQLFreeStmt(hCnct,
                         hStmt,
                         NULL) ;
重要

COMMITまたはROLLBACKが実行されると,文ハンドルが解放されます。この場合は,a_rdb_SQLFreeStmt()を実行しないでください。

a_rdb_SQLFreeStmt()については,「19.4.11 a_rdb_SQLFreeStmt()(文ハンドルの解放)」を参照してください。