IBM Support

[Db2] SQL ステートメントによって変更された行数の取得方法

Question & Answer


Question

更新系の SQL ステートメントによる更新件数をアプリケーションで取得する方法を教えてください。

Answer

SQL ステートメントによって変更された行数をアプリケーションで取得する方法は、利用するインターフェースによって異なります。ここではインターフェースごとの取得方法について説明します。

ステートメントの実行後、実行されたステートメントに関する情報が 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


関連情報
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"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"}]

Document Information

Modified date:
26 August 2023

UID

swg21572117