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) {
}
}