日期:2014-05-17  浏览次数:20511 次

请教一个jdbc调用存储过程的问题??
项目中需要用jdbc调用存储过程,存储过程是第三方提供的,现在只知道这个存储过程会返回一个字符串。以前没接触过存储过程,看的有些晕,现在任务有些急,请教各位。
第三方提供的存储过程:
SQL code

DECLARE @return_value int,@o_bool varchar(1) EXEC @return_value = [dbo].[p_check_workday] @i_empno = N'$empno$' @i_workdt = N'$sdate$',@o_bool = @o_bool OUTPUT SELECT @o_bool as N'@o_bool'


请问:用jdbc如何调用这个存储过程并得到返回值呢?
参考网上写的jdbc调用存储过程方法:
Java code

public void callProcedure(Connection conn, String procedure_name,
    List<Object> list) throws Exception {

    CallableStatement cast = null;
    StringBuffer strb = new StringBuffer();
    strb.append("{call " + procedure_name + "(");
    if (null != list) {
        int listSize = list.size();
        for (int i = 0; i < listSize; i++) {
            if (i == listSize - 1) {
                strb.append("?");
            } else {
                strb.append("?,");
            }
        }
    }
    strb.append(")}");
    cast = conn.prepareCall(strb.toString());
    for (int i = 0; i < list.size(); i++) {
        cast.setString(i + 1, list.get(i).toString());
    }
    cast.executeUpdate();
    conn.commit();
    cast.close();
    }


List list = new ArrayList();
list.add("empno");//第一个参数
list.add("sdate");//第二个参数
callProcedure("[dbo].[p_check_workday]",list);




------解决方案--------------------
你从网上找的这段代码只能调用没有返回值的存储过程
cast = conn.prepareCall(strb.toString());
之后添加
cast.registerOutParameter(1, java.sql.Types.VARCHAR);
这样就设置了输出的参数了,我这里的输出参数是VARCHAR类型的
cast.executeUpdate();
后面添加
outParamter = cast.getString(1);这个就是输出的信息了,
添加的这行 我不确定是在conn.commit();前面还是后面,你测试一下吧
------解决方案--------------------
探讨

1.输入参数是不是$empno$和$sdate$
2.输出参数是@o_bool还是return_value?输出参数是怎么得到的,是通过 @return_value =...得到还是通过 SELECT @o_bool as N'@o_bool'得到的?

------解决方案--------------------
--你这是在数据库中调试SP的例子
--调整下样式,这样看的容易理解
DECLARE @return_value int,@o_bool varchar(1) 

EXEC @return_value = [dbo].[p_check_workday] @i_empno = N'$empno$' @i_workdt = N'$sdate$',@o_bool = @o_bool OUTPUT 

--让出参用列名@o_bool显示执行结果
SELECT @o_bool as N'@o_bool'