使用java定時調用存儲過程,存儲過程的功能是修改表A中字段F is null的記錄,設置字段F=X,正常執行是執行一次后表A中將不會有F is null的記錄,問題是:每次執行都只修改了表A的2或3條記錄
而這個存儲過程在數據庫客戶端工具中直接執行是正確的。
解決方法
如果你的存儲過程中包括insert、delete、update操作,切記:
(1)如果是jdbc調用,使用statement.executeUpdate("sp_xxxx"),千萬不能使用statement.execute("sp_xxxx")
(2)如果使用spring的dao框架:使用jdbcDao.getJDBCTemplate.update("sp_xxxx"),同樣不要使用jdbcDao.getJDBCTemplate.execute("sp_xxxx")
而這個存儲過程在數據庫客戶端工具中直接執行是正確的。
解決方法
如果你的存儲過程中包括insert、delete、update操作,切記:
(1)如果是jdbc調用,使用statement.executeUpdate("sp_xxxx"),千萬不能使用statement.execute("sp_xxxx")
(2)如果使用spring的dao框架:使用jdbcDao.getJDBCTemplate.update("sp_xxxx"),同樣不要使用jdbcDao.getJDBCTemplate.execute("sp_xxxx")
三期開發中也遇到了類似的問題
案件從在審庫轉未立庫的時候,存儲過程執行了一半就退出了,查了好久,幸好在這里找到答案了:)
之前我們一直這么用
我把cstmt.execute();改成cstmt.executeUpdate();之后就可以了
但是奇怪的是 案件從在審庫轉到審結庫的時候確是正常執行,沒有任何異常跡象
ps:在審轉未立和在審轉審結這兩個存儲過程的結構是一樣的,有很多insert、update和delete的操作
之前我們一直這么用
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;
}
});
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();之后就可以了
但是奇怪的是 案件從在審庫轉到審結庫的時候確是正常執行,沒有任何異常跡象
ps:在審轉未立和在審轉審結這兩個存儲過程的結構是一樣的,有很多insert、update和delete的操作
這個是在sybase下發生的問題。jdbc的標準雖然是那么定的--execute()中調用了executeUpdate(),但sybase實現的com.sybase.jdbc3.jdbc.SybDriver就不好說了