JDBC之CallableStatement(转)

CallableStatement接口扩展PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement接口还具有对PreparedStatement接口提供的输入参数的支持。

CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般SQL类型),从这些参数中检索结果,或者检查所返回的值是否为JDBC NULL!

1,创建CallableStatement对象:

        CallableStatement对象是用Connection方法prepareCall创建的。下例创建CallableStatement的实例,其中含有对已存储过程PROC_H2_HZ_RE调用。

Session session = null;
CallableStatement st = null;
try {
     session = uiDao.getHibernateTemplate().getSessionFactory().openSession();
     Connection conn = session.connection();
     // 生成存储过程名
      st = conn.prepareCall("{ call PROC_H2_HZ_RE(?,?,?,?,?,?,?,?,?)}");

        其中?占位符为IN、OUT还是INOUT参数,取决于已存储过程PROC_H2_HZ_RE。

2,IN和OUT参数:

        将IN参数传给CallableStatement对象是通过setXXX方法完成的。该方法继承自PreparedStatement。所传入参数的类型决定了所用的setXXX方法(例如,用setFloat来传入float值等)。

st.setString("MOBILE", mobile);
st.setString("OPER", oper);
st.setDate("OPERTIME", new java.sql.Date(new Date().getTime()));
st.setInt("SOURCE", 1);
st.setInt("H2SERVICEID", 6);
st.setString("OPERTYPE", opertype);
st.setInt("HZTEL", Integer.valueOf(tranNum));

        如果已存储过程返回OUT参数,则在执行CallableStatement对象以前必须先注册每个OUT参数的JDBC类型(这是必须的,因为某些DBMS要求JDBC类型)。注册JDBC类型是用registerOutParameter方法来完成的。语句执行完后,CallableStatement的getXXX方法将取回参数值。正确的getXXX方法是为各参数所注册的JDBC类型所对应的Java类型。换言之,registerOutParameter使用的是JDBC类型(因此它与数据库返回的JDBC类型匹配),而getXXX将之转换为Java类型。

st.registerOutParameter("ERRORCODE", java.sql.Types.INTEGER);
st.registerOutParameter("CONTENT", java.sql.Types.VARCHAR);
st.execute();
Integer iret = st.getInt("errorcode");
String content = st.getString("content");

        作为示例,上述代码先注册OUT参数,执行由st所调用的已存储过程,然后检索在OUT参数中返回的值。从某个OUT参数中取出一个BigDecimal对象的话,可以在getBigDecimal()里双引号后面加上逗号再加上一个数字。(代表了小数点后面带几位数!)

3,最后关闭CallableStatement和Session:

} catch (Exception e) {
        System.out.println("异常--callTranferSet----"+e.getMessage());
} finally {
    try {
        if (null != st)
            st.close();
        if (null != session)
            session.close();
    } catch (SQLException e1) {
    }
}

猜你喜欢

转载自coyotestark.iteye.com/blog/2293800