以前一直回避此问题,现在到了不得不做的地步了,网上代码找了七八份,东拼西凑,终于跑通了。
存储过程:
begin
select count ( * ) into csCount from csjl where to_char(qssj, ' yyyy-mm-dd ' ) = cesuDate;
end handiwork;
ibatis配置文件:
<!-- 参数 -->
< parameter property = " cesuDate " jdbcType = " VARCHAR2 " javaType = " java.lang.String " mode = " IN " />
< parameter property = " csCount " jdbcType = " DOUBLE " javaType = " java.lang.Long " mode = " OUT " />
</ parameterMap >
<!-- 调用存储过程 -->
< procedure id = " cesu " parameterMap = " parameterMapCesu " >
{call handiwork( ? , ? )}
</ procedure >
java代码:
return (Long) this .getSqlMapClientTemplate().execute( new SqlMapClientCallback() {
@SuppressWarnings( " unchecked " )
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
long csCount = 0 ;
try {
// 设置存储过程参数
Map cesu = new HashMap();
cesu.put( " cesuDate " , cesuDate); // 输入参数
cesu.put( " csCount " , 0 ); // 输出参数
// 调用存储过程
executor.queryForObject( " test.cesu " ,cesu); // ibatis文件的namespace是test
csCount = (Long)cesu.get( " csCount " ); // 获取返回值
return csCount;
} catch (Exception e) {
e.printStackTrace();
return null ;
}
}
});
}
目前我只会返回值是单值的,这个返回还真是折腾死人啊!
血泪史:
第一把弄的时候,没有设返回值,稍稍顺利一点。过程如下:
1、尝试过像执行查询那样,在<procedure>里面设parameterClass,然后在executor.queryForObject时获取返回值,失败!
2、配置了parameterMap来作为存储过程的参数,但是存储过程参数的类型的Date型的,在Map里面设置jdbcType="DATE" javaType="java.lang.String",依旧失败,一直是类型不对,看来是没找对jdbcType的值呀,放弃了。
3、改存储过程,把参数换成VARCHAR2的,总算是磕磕碰碰的过了。
第二把,需要添加返回值,NUMBER型的,郁闷死我了,过程如下:
1、尝试过像执行查询那样,在<procedure>里面设resultClass,然后直接在executor.queryForObject是获取返回值,失败!
2、Map里面添加了返回值的项,设置jdbcType="NUMBER" javaType="java.lang.Integer",失败,Check the output parameters (register output parameters failed),告知列类型不对
3、存储过程的调用试过{?=call handiwork(?)},失败,告知参数数量
4、经过种种排列组合后,正解为jdbcType="DOUBLE" javaType="java.lang.Long"。
复杂返回值的诸如结果集、游标啥的,俺还没试,以后慢慢补吧!
jdbcType和javaType以及Oracle中数据类型的对应关系也得慢慢填充。这两三天的收获只有NUMBER-DOUBLE-java.lang.Long而已,愧对江东父老!