知识大全 Ibatis调用Oracle存储过程

Posted 类型

篇首语:天下之事常成于困约,而败于奢靡。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Ibatis调用Oracle存储过程相关的知识,希望对你有一定的参考价值。

Ibatis调用Oracle存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  最近开始接触Oracle了 接触的越多越感受到自己的渺小!(oracle g Ibatis)

  昨天需要通过数据库查询一组数据 数据中包含一个表中的一条数据 个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(? ? ? ?)

  欲哭无泪啊!!!!

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

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

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

  纠结一番 明白了

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

  <procedure id= P_DJ_GETRYANDPYRBYRYID   parameterMap= parameterDJRYID   resultClass= java util HashMap >

  call P_DJ_GETRYANDPYRBYRYID(? ? ? ?)    //我的存储过程

  </procedure>

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

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

  <procedure id= P_DJ_GETRYANDPYRBYRYID   parameterMap= parameterDJRYID   resultMap= DjRyResult >

  call P_DJ_GETRYANDPYRBYRYID(? ? ? ?)

  </procedure>

  DjRyResult就是我的Ibatis中针对DjRy定义的resultMap 这样我就可以将返回的结果集传递给DjRy的List中进行遍历了

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

  map put( PYR_IDS paramMap get( PYR_IDS ));    //传回的两个参数

  map put( PYR_XMS paramMap get( PYR_XMS ));

  map put( MY_CUR list);

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

cha138/Article/program/Oracle/201311/18047

相关参考

知识大全 VFP中调用Oracle的存储过程

VFP中调用Oracle的存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  VFP由于其通

知识大全 一个简单的oracle分页存储过程的实现和调用

  在看了众多的分页存储过程以后发现都是针对sqlserver的而没有oracle的因此想写一个关于oracle的存储过程因为我用到的数据库是oracleoracle分页存储过程的思路于sqlserv

知识大全 Jsp中调用Oracle存储过程的小例子

Jsp中调用Oracle存储过程的小例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /*执行

知识大全 调用Oracle数据库中的存储过程需要两步走

调用Oracle数据库中的存储过程需要两步走  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  存储

知识大全 使用VB调用Oracle程序包内的存储过程返回结果集

使用VB调用Oracle程序包内的存储过程返回结果集  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 使用OTL调用Oracle的存储函数

使用OTL调用Oracle的存储函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  OTL介绍 

知识大全 如何通过hibernate调用存储过程

用hibernate操作数据库可以通过获取的session值调用connection()方法获取connection从而调用存储过程java调用存储过程什么是存储过程?存储过程是指保存在数据库并在数据

知识大全 ASP调用存储过程源码示例

ASP调用存储过程源码示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASP调用存储过程源码

知识大全 调用存储过程[1]

C#高级编程:调用存储过程[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 调用存储过程[2]

C#高级编程:调用存储过程[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs