- PR -

JDBCでレコード再検索時に「フェッチ順序が無効」

1
投稿者投稿内容
mimi
会議室デビュー日: 2005/06/13
投稿数: 2
投稿日時: 2005-11-21 23:20
お世話になります。
ORACLEでUPDATEに失敗(抽出条件に一致するレコード無し)した後、同一テーブルのレコードを再検索するとSQLExceptionが発生してしまいます。原因、対策をご存知の方がおられましたら、ご教授ください。よろしくお願い致します。
@table_1からFieldAの値を取得する。(ここでは"001"だったとする)
select FieldA from table_1 where FieldB='XXX';
AFieldAから取得した値を変更する("001"から"002"に変更)
その他諸々の業務処理を行う
Bupdate table_1 set FieldA='002' where FieldB='XXX' and FieldA='001';
C更新がOKだったら処理終了。
D同一レコードのFieldAの値を他のプロセスが既に更新済みだった場合、update件数が0となるので、
@からリトライを行う。
⇒この時、@の再検索でResultsetのexecuteQueryの後、
next()メソッドで「ORA-01002: フェッチ順序が無効です。」となってしまいます。
(ソース抜粋)
Connection dbCon; //接続済み
Statement stmt = null;
ResultSet rs = null;
String strsql = null;
String Aold = "";
String Anew = "";
int execCnt = 0;
boolean successFlg = false;
stmt = dbCon.createStatement();
//指定コード名の現在値を取得
strsql = "select FieldA from table_1 where FieldB='XXX'";
while(!successFlg){
rs = stmt.executeQuery( strsql );
rs.next();
Aold = rs.getString( "FieldA" );
rs.close();
rs = null;
//FieldAの設定値変更
//その他の業務処理
・・・・・・・・
Anew = "002";
//変更後の値をDBに保存
//変更前の値を検索条件に加えて他プロセスに更新されている場合は
/ループし処理をやり直す。
strsql = "update table_1 set FieldA='" + Anew
+ "' where FieldB='XXX' and FieldA='" + Aold + "'";
execCnt = stmt.executeUpdate( strsql );
//正常終了の場合はループを抜ける条件を設定の後、commit
if (0 < execCnt) {
successFlg = true;
dbCon.commit();
}
}
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-22 00:02
ループの2周目でstrsql変数には何がはいっていると思いますか?
mimi
会議室デビュー日: 2005/06/13
投稿数: 2
投稿日時: 2005-11-22 11:59
シュン様
ご指摘ありがとうございました。
おっしゃるとおり、単純なケアレスミスでした。
1

スキルアップ/キャリアアップ(JOB@IT)