代 码 之 家
☆╭╮╭╮の
╭☆┴┴☆╮
│╭╮╭╮ │
╰○--○╯

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

存储过程:

create or replace procedure handiwork(cesuDate in varchar2,csCount out numberis
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而已,愧对江东父老!

posted on 2011-05-13 17:02  娜娜  阅读(2005)  评论(1编辑  收藏  举报