以前一直回避此问题,现在到了不得不做的地步了,网上代码找了七八份,东拼西凑,终于跑通了。
存储过程:
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而已,愧对江东父老!
◑▂◐ ◑ω◐ ◑^◐ 初来置业,从一钉一铆开始 ◑△◐ ◑﹏◐ ◑0◐