使用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就不好说了