天天看点

Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题

     最近开始接触oracle了,接触的越多越感受到自己的渺小!(oracle10g ,ibatis)

   昨天需要通过数据库查询一组数据,数据中包含一个表中的一条数据、2个string类型的字符串,想通过oralce的存储过程实现。

ibatis映射配置:

<parametermap id="parameterdjryid" class="java.util.hashmap" >    

<parameter property="v_ryid" jdbctype="integer" javatype="java.lang.integer" mode="in"/>  //存储过程传入参数

<parameter property="pyr_ids" jdbctype="varchar" javatype="java.lang.string" mode="out" />  //存储过程传出参数

<parameter property="pyr_xms" jdbctype="varchar" javatype="java.lang.string" mode="out"/>  //存储过程传出参数

<parameter property="my_cur" jdbctype="oraclecursor"  javatype="java.sql.resultset" mode="out"/>    //存储过程传出参数  

</parametermap>    

<procedure id="p_dj_getryandpyrbyryid"  parametermap="parameterdjryid"  resultclass="java.util.hashmap">    

{call p_dj_getryandpyrbyryid(?)}    //我的存储过程

</procedure>

service类调用ibatis的代码:

map parammap = new hashmap();

        parammap.put("v_ryid", primarykey);   

        list <djry> list = dbutil.getobjectlist("t_dj_ry.p_dj_getryandpyrbyryid", parammap);   //这个是我们自己封装的工具,主要操作ibatis,这里可以看成ibatis查询并返回list结果。

        map<string, object> map = new hashmap<string, object>();  

map.put("pyr_ids", parammap.get("pyr_ids"));    //传回的两个参数

map.put("pyr_xms", parammap.get("pyr_xms"));  

map.put("my_cur", list);

至于我的存储过程就不写出来了,没什么需要特殊写明的,只是数据库的一些关联查询,比较麻烦,就不贴出来了。

运行起来后,没成功。。。。

提示的错误信息要求检查输出类型:

--- check the output parameters (register output parameters failed).  

--- cause: java.sql.sqlexception: 无效的列类型

在google上百度了一下,大部分的人问题的原因都是在ibatis映射配置时,传入传出的参数中jdbctype与javatype的类型不正确,可是我多番验证,我的类型是正确的。同时我将传出的参数一个个的减少,直到没有传出参数才能正常运行。真的郁闷了。。。。

经过几个小时的纠结,终于发现问题的所在了。

在ibatis映射配置中,当我调用存储过程中,需要使用?进行参数的占位符,而这个参数不能只写入参,还要写出参。。。。

也就是说,我的ibatis映射配置中调用存储过程的代码应该这样写:

{call p_dj_getryandpyrbyryid(?,?,?,?)}    

欲哭无泪啊!!!!

这样程序终于运行起来了,生活还要继续,问题还要继续产生啊!

现在是能够在数据库端将数据返回了,返回的结果是2个string类型的字符串,一个结果集。现在我要实现的效果是将结果集给一个list<djry>(djry是我的javabean类),那2个字符串就不用理会了。

可是我怎么给,djry这个类都不接受!出错了。。。

纠结一番,明白了。

原来我在ibatis映射配置中,定义的存储过程的返回值为hashmap(下面红色的字体)

{call p_dj_getryandpyrbyryid(?,?,?,?)}    //我的存储过程

而这个返回值只是指我3个返回值中结果集的返回值,所以说我返回的结果集是以hashmap的类型存在的,当我将list中的每一个元素给javabean时,就会发生类型转换错误。

此处需要将定义存储过程的代码改为:

<procedure id="p_dj_getryandpyrbyryid"  parametermap="parameterdjryid"  resultmap="djryresult">    

djryresult就是我的ibatis中针对djry定义的resultmap。这样我就可以将返回的结果集传递给djry的list中进行遍历了。

还有我的parammap中在数据库操作之前需要将参数存入,在操作数据库之后,parammap中会存放返回值中非结果集的参数(包括入参、出参),而在ibatis中定义的出参my_cur其实在parammap中是null值,而list中存放的却是我的结果集返回值。所以在获取返回的参数时,才会按照下面的方式进行:

这样也产生了新的问题,当我们在开发过程中,如果要返回2个结果集(或者说存储过程中,要返回2个游标),又要怎么处理呢?这个还真没想到!谁要是知道,互相交流一下啊!

真不容易啊,就这些弄了一天,落后就要折腾啊!