使用java定時(shí)調(diào)用存儲(chǔ)過程,存儲(chǔ)過程的功能是修改表A中字段F is null的記錄,設(shè)置字段F=X,正常執(zhí)行是執(zhí)行一次后表A中將不會(huì)有F is null的記錄,問題是:每次執(zhí)行都只修改了表A的2或3條記錄
而這個(gè)存儲(chǔ)過程在數(shù)據(jù)庫(kù)客戶端工具中直接執(zhí)行是正確的。
解決方法
如果你的存儲(chǔ)過程中包括insert、delete、update操作,切記:
(1)如果是jdbc調(diào)用,使用statement.executeUpdate("sp_xxxx"),千萬不能使用statement.execute("sp_xxxx")
(2)如果使用spring的dao框架:使用jdbcDao.getJDBCTemplate.update("sp_xxxx"),同樣不要使用jdbcDao.getJDBCTemplate.execute("sp_xxxx")
三期開發(fā)中也遇到了類似的問題
案件從在審庫(kù)轉(zhuǎn)未立庫(kù)的時(shí)候,存儲(chǔ)過程執(zhí)行了一半就退出了,查了好久,幸好在這里找到答案了:)
之前我們一直這么用
String procedure = "{call K_FY..PR_ZS2WL_" + getAJLBShortName(iAjlb) + "(?) }";
getJdbcDAO().getJdbcTemplate().execute(
procedure, new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cstmt)
throws SQLException, DataAccessException {
cstmt.setLong(1, lAjbh);
cstmt.execute();
return null;
}
});
我把
cstmt.execute();改成
cstmt.executeUpdate();之后就可以了
但是奇怪的是 案件從在審庫(kù)轉(zhuǎn)到審結(jié)庫(kù)的時(shí)候確是正常執(zhí)行,沒有任何
異常跡象
ps:在審轉(zhuǎn)未立和在審轉(zhuǎn)審結(jié)這兩個(gè)存儲(chǔ)過程的結(jié)構(gòu)是一樣的,有很多insert、update和delete的操作
這個(gè)是在sybase下發(fā)生的問題。jdbc的標(biāo)準(zhǔn)雖然是那么定的--execute()中調(diào)用了executeUpdate(),但sybase實(shí)現(xiàn)的com.sybase.jdbc3.jdbc.SybDriver就不好說了
posted on 2008-08-30 14:57
歲月如歌 閱讀(1498)
評(píng)論(0) 編輯 收藏 所屬分類:
java