解决方案 »

  1.   

    @success int output 把@success设为返回结果信息
    同时把@success作为第4个参数传递。然后 cstm.registerOutParameter(4, java.sql.Types.INTEGER);
    通过int success=stmt.getInt(4);取返回的结果信息
      

  2.   

    sql里注册了output参数 然后  jdbc 中    registerOutParameter
      

  3.   

    有两个部分你需要修改:
    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);
     
      

  4.   


    先感谢各位的回答,用out参数的方法我也试过了.
    在执行完存储过程后,会有多个ResultSet,而且无法确定out参数在哪个ResultSet中,
    昨天没有找到解决方案 所以就先写了个递归来寻找, 当前ResultSet中如果取不到,
    就调用CallableStatement的getMoreResults()方法,继续取, 但是总觉得这样会有问题,
    有没有办法不使用out参数就可以取到success参数,或者使用out参数,但可以精确定位到该参数的位置呢?还有一个现象就是 如果使用最简单的传入out参数,然后赋值 直接select @outputParam这样的存储过程,
    是可以直接在第一个ResultSet取到out参数的,但是中间加了逻辑就不行了,我测了下,1楼贴出来的存储过程要遍历10多个ResultSet才能取到out参数,暂时还没找到原因.
      

  5.   


    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.   


    见6楼, 简单的存储过程这么做没问题, 但是实际应用中在调用带有insert delete等语句的存储过程时出现我在6楼说的现象.