spring+struts+ibatis调用存储过程

以前一直回避此问题,现在到了不得不做的地步了,网上代码找了七八份,东拼西凑,终于跑通了。

存储过程:

create   or   replace   procedure  handiwork(cesuDate  in   varchar2 ,csCount out  number is
begin
  
select   count ( * into  csCount  from  csjl  where  to_char(qssj, ' yyyy-mm-dd ' ) =  cesuDate;
end  handiwork;

ibatis配置文件:

< parameterMap id = " parameterMapCesu "   class = " java.util.Map " >   
    
<!--  参数  -->   
    
< 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代码:

public  Long doTest( final  String cesuDate) {
    
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而已,愧对江东父老!

转载于:https://www.cnblogs.com/jinqiuqiu1120/archive/2011/05/13/2045261.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值