18.2.2 データを参照する場合
データの参照方法の例を説明します。ここでは,カーソルを使用した行の取り出し方法について説明します。カーソルを使用した行の取り出し方法を次の図に示します。
各処理の詳細を次に説明します。
- 〈この項の構成〉
(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のDECIMAL型,NUMERIC型,BINARY型,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);
-
DECIMAL型またはNUMERIC型のデータを変換する場合は,a_rdb_CNV_DECIMALchar()を使用します。a_rdb_CNV_DECIMALchar()については,「19.5.9 a_rdb_CNV_DECIMALchar()(DECIMAL型またはNUMERIC型データの変換)」を参照してください。
-
BINARY型のデータを変換する場合は,a_rdb_CNV_BINARYchar()を使用します。a_rdb_CNV_BINARYchar()については,「19.5.7 a_rdb_CNV_BINARYchar()(BINARY型データの変換)」を参照してください。
-
VARBINARY型のデータを変換する場合は,a_rdb_CNV_VARBINARYchar()を使用します。a_rdb_CNV_VARBINARYchar()については,「19.5.12 a_rdb_CNV_VARBINARYchar()(VARBINARY型データの変換)」を参照してください。
-
DATE型のデータを変換する場合は,a_rdb_CNV_DATEchar()を使用します。a_rdb_CNV_DATEchar()については,「19.5.8 a_rdb_CNV_DATEchar()(DATE型データの変換)」を参照してください。
-
TIME型のデータを変換する場合は,a_rdb_CNV_TIMEchar()を使用します。a_rdb_CNV_TIMEchar()については,「19.5.10 a_rdb_CNV_TIMEchar()(TIME型データの変換)」を参照してください。
-
TIMESTAMP型のデータを変換する場合は,a_rdb_CNV_TIMESTAMPchar()を使用します。a_rdb_CNV_TIMESTAMPchar()については,「19.5.11 a_rdb_CNV_TIMESTAMPchar()(TIMESTAMP型データの変換)」を参照してください。
(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()(文ハンドルの解放)」を参照してください。