java调用存储过程取返回值问题 javasqlmssql存储过程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 @success int output 把@success设为返回结果信息同时把@success作为第4个参数传递。然后 cstm.registerOutParameter(4, java.sql.Types.INTEGER);通过int success=stmt.getInt(4);取返回的结果信息 sql里注册了output参数 然后 jdbc 中 registerOutParameter 有两个部分你需要修改:1.存储过程需要定义一个返回参数:create procedure sp_saveColumnturn(@args1 varchar(2000),@result int out )2.java在调用存储过程中需要返回值时需要注册返回值类型:registerOutParameter CallableStatement cstmt = conn.prepareCall("{ call sp_saveColumnturn(?,?) }"); cstmt.setString(1, "arg1"); cstmt.registerOutParameter(2,Types.INTEGER); cstmt.execute(); int result = cstmt.getInt(2); System.out.println(result); 先感谢各位的回答,用out参数的方法我也试过了.在执行完存储过程后,会有多个ResultSet,而且无法确定out参数在哪个ResultSet中,昨天没有找到解决方案 所以就先写了个递归来寻找, 当前ResultSet中如果取不到,就调用CallableStatement的getMoreResults()方法,继续取, 但是总觉得这样会有问题,有没有办法不使用out参数就可以取到success参数,或者使用out参数,但可以精确定位到该参数的位置呢?还有一个现象就是 如果使用最简单的传入out参数,然后赋值 直接select @outputParam这样的存储过程,是可以直接在第一个ResultSet取到out参数的,但是中间加了逻辑就不行了,我测了下,1楼贴出来的存储过程要遍历10多个ResultSet才能取到out参数,暂时还没找到原因. public void text(final int userId) { this.jdbcTemplate.execute(new CallableStatementCreator(){ public CallableStatement createCallableStatement(Connection conn) throws SQLException { CallableStatement cs = conn.prepareCall("{call PRO_TEST(?,?,?,?,?)}"); cs.setString(1, null); cs.setString(2, null); cs.setInt(3, 2); cs.setInt(4, userId); cs.registerOutParameter(5, Types.VARCHAR); return cs; } }, new CallableStatementCallback(){ public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); return cs.getString(5);// 获取输出参数的值 } }); } 见6楼, 简单的存储过程这么做没问题, 但是实际应用中在调用带有insert delete等语句的存储过程时出现我在6楼说的现象. Excel导入时外键的代码如何处理 如何用j2me开发webservice 服务 dwr Illegal access to default constructor错误 struts1.2急! 怎样实现一个状态监控功能 为什么<html:errors>不在一行显示 reference应该如何翻译? 内存溢出问题 有没有介绍struts分页的例子 为什么j2eesdk自带的J2EE服务器无法启动? 【求助】关于整合spring springmvc hibernate hibernate configuration
同时把@success作为第4个参数传递。然后 cstm.registerOutParameter(4, java.sql.Types.INTEGER);
通过int success=stmt.getInt(4);取返回的结果信息
1.存储过程需要定义一个返回参数:
create procedure sp_saveColumnturn(@args1 varchar(2000),@result int out )
2.java在调用存储过程中需要返回值时需要注册返回值类型:registerOutParameter CallableStatement cstmt = conn.prepareCall("{ call sp_saveColumnturn(?,?) }");
cstmt.setString(1, "arg1");
cstmt.registerOutParameter(2,Types.INTEGER);
cstmt.execute();
int result = cstmt.getInt(2);
System.out.println(result);
先感谢各位的回答,用out参数的方法我也试过了.
在执行完存储过程后,会有多个ResultSet,而且无法确定out参数在哪个ResultSet中,
昨天没有找到解决方案 所以就先写了个递归来寻找, 当前ResultSet中如果取不到,
就调用CallableStatement的getMoreResults()方法,继续取, 但是总觉得这样会有问题,
有没有办法不使用out参数就可以取到success参数,或者使用out参数,但可以精确定位到该参数的位置呢?还有一个现象就是 如果使用最简单的传入out参数,然后赋值 直接select @outputParam这样的存储过程,
是可以直接在第一个ResultSet取到out参数的,但是中间加了逻辑就不行了,我测了下,1楼贴出来的存储过程要遍历10多个ResultSet才能取到out参数,暂时还没找到原因.
public void text(final int userId) { this.jdbcTemplate.execute(new CallableStatementCreator(){
public CallableStatement createCallableStatement(Connection conn) throws SQLException {
CallableStatement cs = conn.prepareCall("{call PRO_TEST(?,?,?,?,?)}");
cs.setString(1, null);
cs.setString(2, null);
cs.setInt(3, 2);
cs.setInt(4, userId);
cs.registerOutParameter(5, Types.VARCHAR);
return cs;
}
}, new CallableStatementCallback(){
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.execute();
return cs.getString(5);// 获取输出参数的值
}
});
}
见6楼, 简单的存储过程这么做没问题, 但是实际应用中在调用带有insert delete等语句的存储过程时出现我在6楼说的现象.