Question & Answer
Question
更新系の SQL ステートメントによる更新件数をアプリケーションで取得する方法を教えてください。
Answer
SQL ステートメントによって変更された行数をアプリケーションで取得する方法は、利用するインターフェースによって異なります。ここではインターフェースごとの取得方法について説明します。
ステートメントの実行後、実行されたステートメントに関する情報が SQLCA にセットされます。
ステートメントによる更新件数をアプリケーションで取得するには SQLCA の SQLERRD の 3 番目を使用します。
以下は UPDATE ステートメントを使用して ORG 表の DIVISION 列を変更する例です。
例では UPDATE ステートメントを使用しますが、INSERT/DELETE/MERGE ステートメントでも同様に変更件数を取得できます。
以下の例の更新件数は、いずれも 10 件です。
CLP の場合
-a オプションを使用し SQLCA 構造体を出力します。
組み込み SQL アプリケーションの場合
SQLCA 構造体から値を取得します。
C/C++ は添え字は 0 から始まるため、 3 番目の値をチェックするには sqlca.sqlerrd[2] を参照します。
[プログラムの例]
CLI アプリケーションの場合
SQLCA の情報を参照するため、SQLGetDiagField 関数を使用します。
更新件数は、SQL_DIAG_ROW_COUNT フィールドを指定すると第 5 引数の DiagInfoPtr にセットされます。
この関数を利用するサンプルプログラムが、$HOME/sqllib/samples/cli/clisqlca.c にあります。
[プログラムの例]
Java アプリケーションの場合
Statement.executeUpdate メソッドの戻り値が更新対象件数となります。
以下のプログラムでは、Statement オブジェクト stmt を作成して UPDATE ステートメントを実行し、numUpd に更新された行の数を戻します。
[プログラムの例]
関連情報
ステートメントの実行後、実行されたステートメントに関する情報が SQLCA にセットされます。
ステートメントによる更新件数をアプリケーションで取得するには SQLCA の SQLERRD の 3 番目を使用します。
以下は UPDATE ステートメントを使用して ORG 表の DIVISION 列を変更する例です。
例では UPDATE ステートメントを使用しますが、INSERT/DELETE/MERGE ステートメントでも同様に変更件数を取得できます。
以下の例の更新件数は、いずれも 10 件です。
CLP の場合
-a オプションを使用し SQLCA 構造体を出力します。
$ db2 -a "update org set division = 'TEST'"
SQLCA Information
sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0
sqlerrmc:
sqlerrp : SQLNQ209
sqlerrd : (1) 0 (2) 0 (3) 10
(4) 0 (5) 0 (6) 0
sqlwarn : (1) W (2) (3) (4) (5) W (6)
(7) (8) (9) (10) (11)
sqlstate: 01504
組み込み SQL アプリケーションの場合
SQLCA 構造体から値を取得します。
C/C++ は添え字は 0 から始まるため、 3 番目の値をチェックするには sqlca.sqlerrd[2] を参照します。
[プログラムの例]
EXEC SQL INCLUDE SQLCA;
EXEC SQL UPDATE ORG SET DIVISION='TEST' ;
if (sqlca.sqlcode == 0) {
printf("updated %d rows\n", sqlca.sqlerrd[2]);
}
[プログラム実行結果]
updated 10 rows
CLI アプリケーションの場合
SQLCA の情報を参照するため、SQLGetDiagField 関数を使用します。
更新件数は、SQL_DIAG_ROW_COUNT フィールドを指定すると第 5 引数の DiagInfoPtr にセットされます。
この関数を利用するサンプルプログラムが、$HOME/sqllib/samples/cli/clisqlca.c にあります。
[プログラムの例]
cliRC = SQLExecute(hstmt);
STMT_HANDLE_CHECK(hstmt, hdbc, cliRC);
cliRC = SQLGetDiagField (SQL_HANDLE_STMT,
hstmt,
0,
SQL_DIAG_ROW_COUNT,
&diagPtr,
SQL_IS_INTEGER,
&strLenPtr);
STMT_HANDLE_CHECK(hstmt, hdbc, cliRC);
printf("updated %d rows\n", diagPtr);
[プログラム実行結果]
updated 10 rows
Java アプリケーションの場合
Statement.executeUpdate メソッドの戻り値が更新対象件数となります。
以下のプログラムでは、Statement オブジェクト stmt を作成して UPDATE ステートメントを実行し、numUpd に更新された行の数を戻します。
[プログラムの例]
Connection con;
Statement stmt;
int numUpd;
...
stmt = con.createStatement();
numUpd = stmt.executeUpdate( "UPDATE ORG SET DIVISION='TEST'");
System.out.println("updated " + numUpd + " rows");
stmt.close();
[プログラム実行結果]
updated 10 rows
関連情報
[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkrAAE","label":"Programming Interface"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]
Was this topic helpful?
Document Information
Modified date:
26 August 2023
UID
swg21572117