昨天需要通过数据库查询一组数据,数据中包含一个表中的一条数据、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(下面红色的字体)
<procedure id="P_DJ_GETRYANDPYRBYRYID" parameterMap="parameterDJRYID" resultClass="java.util.HashMap">
{call P_DJ_GETRYANDPYRBYRYID(?,?,?,?)} //我的存储过程
</procedure>
而这个返回值只是指我3个返回值中结果集的返回值,所以说我返回的结果集是以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);
这样也产生了新的问题,当我们在开发过程中,如果要返回2个结果集(或者说存储过程中,要返回2个游标),又要怎么处理呢?这个还真没想到!谁要是知道,互相交流一下啊!
真不容易啊,就这些弄了一天,落后就要折腾啊!
本文出自 “Key-Value” 博客,请务必保留此出处http://keyvalue.blog.51cto.com/1475446/450113
发表评论
-
查看当前Session SQL
2014-07-08 11:51 1096SELECT (SELECT listagg(b.sql_te ... -
CLOB列 XML信息查看
2014-05-28 10:28 1032--使用该SQL查询节点情况 SELECT * FROM ... -
【转】ORACLE 临时表空间使用率过高的原因及解决方案
2012-12-25 15:24 1040http://www.cnblogs.com/wonder31 ... -
oracle:获取session的IP地址
2012-10-20 02:38 4333方法1 创建触发器: create orreplace ... -
Oracle ora-01002
2012-08-11 02:43 28966ORA-01002:fetch超出序列 ... -
提高Oracle SQL的执行效率的3个方案
2012-08-08 00:57 1010如果你想要提高Oracle SQL ... -
Oracle STA
2012-08-06 11:32 0第一步:创建优化任务 ... -
Oracle SQL小技巧
2012-08-06 11:21 01.两个字段可空的判断相等,用decode判断。 例子:d ... -
自动工作负载库(Automatic Workload Repository,AWR)
2012-07-23 22:45 1443自动工作负载库(Automatic Workload Repo ... -
orace的隔离级别
2012-07-21 01:06 1109隔离级别(isoation eve) 隔离级别定义了事务与 ... -
Oracle SQLID 与 Hash_value 之间的相互转化
2012-07-20 00:55 4721一、什么是SQLID SQLID是根据SQL 文本,经过 ... -
Oracle优化器和索引原
2012-07-13 00:34 1289Oracle优化器和索引原理 ============ ... -
Oracle优化器的RBO和CBO方式
2012-07-13 00:25 2427[/size]Or[size=large][size=smal ... -
Oracle 优化器详解
2012-07-13 00:18 1360一、优化器基本知识 Oracle在执行一个SQL之前,首先 ... -
SQL中使用WITH AS提高性能
2012-07-05 23:30 1274摘要:本文结合笔者实 ... -
Oracle表连接操作——Hash Join(哈希连接
2012-05-20 17:05 0连接 http://space.itpub.net/?uid ... -
Oracle hash join
2012-05-20 17:00 966hash join是oracle里面一个 ... -
转--一次HASH JOIN 临时表空间不足的分析和优化思路
2012-05-20 15:36 4570最近遇到一个语句, 只要一执行这个语句就会出现报错临时表空间 ... -
SQL*PLUS SET 变量
2012-05-02 22:46 886SQL*PLUS SET变量 SQL*PLUS维护系 ... -
转---借助内存表处理复杂的oracle查询要求.
2012-03-25 23:23 1427借助内存表处理复杂的oracle查询要求. 在日常业务处理过 ...
相关推荐
ibatis调用oracle存储过程分页
在IT领域,特别是数据库操作与Java开发中,利用ibatis框架调用...通过上述步骤,我们可以成功地使用ibatis调用Oracle存储过程,并处理返回的多个结果集。这不仅简化了数据库操作,还提高了代码的可读性和可维护性。
### Ibatis调用Oracle存储过程返回自定义类型 在企业级应用开发中,尤其是在金融、保险等业务场景中,往往需要处理复杂的数据结构与逻辑。本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现...
本文将详细探讨如何使用iBATIS调用Oracle存储过程,并处理返回的Cursor结果集。 首先,理解iBATIS调用存储过程的基本原理。iBATIS允许开发者在映射文件中定义存储过程调用,通过`<procedure>`标签来实现。在这个...
本文将深入探讨如何在ibatIS框架中调用存储过程,以及涉及到的相关知识点。 首先,ibatIS是一个基于Java的轻量级持久层框架,它提供了灵活的SQL映射机制,使得开发者可以方便地进行数据库操作。ibatIS的核心理念是...
其中,`id`是方法名,`parameterType`表示没有输入参数,`resultType`则是返回结果的类型,这里我们假设存储过程返回的是一个Map。 2. **带参数的存储过程** 对于带参数的存储过程,我们需要在`<select>`标签内...
- 如果存储过程返回多个结果集,可以通过`<resultMap>`标签和`<collection>`标签来处理。 通过以上步骤,你可以在Ibatis中顺利调用Oracle的函数和存储过程,实现数据库层面的复杂操作。记住,正确配置和使用参数是...
iBatis调用存储过程
根据提供的文件信息,标题为“ibatis调用存储过程”,主要关注的是如何使用ibatis框架来调用数据库中的存储过程。下面将详细解释ibatis框架的基本概念、存储过程的概念以及如何在ibatis中配置和执行存储过程。 ### ...
当存储过程返回游标时,iBatis允许我们通过`resultMap`来映射结果集,例如: ```xml ``` 这个`resultMap`用于将查询结果映射到Java对象上,其中每个`result`元素对应结果集中的一列。 对于返回游标的...
在iBatis中,当存储过程返回一个游标时,你可以将其映射为一个Java List。为此,你需要在Java方法中声明一个List类型的参数,而在SQL映射文件中,使用`<resultMap>`定义一个结果集映射,然后在`<selectResult>`标签...
在Java开发中,使用iBATIS(现在称为MyBatis)作为持久层框架时,调用数据库的存储过程是一种常见的需求。本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库...
它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;可以非常简单的配置和自定义,以适应任何需要与数据库交互的应用。 #### 三、Ibatis中调用存储过程的步骤 ##### 3.1 配置XML映射文件 在Ibatis中,...
在这个项目中,我们结合了Spring框架、Ibatis持久层框架以及Blazeds技术,来演示如何调用存储过程并处理返回的结果集。下面将详细讲解这些技术的运用。 首先,J2EE是一种广泛用于开发分布式企业应用的平台,它提供...
3. **存储过程调用**:Ibatis可以通过`<select>`、`<procedure>`元素调用Oracle的存储过程,增强业务逻辑的封装性。 4. **连接池管理**:Ibatis可以与各种连接池(如C3P0、Druid、HikariCP等)集成,提高数据库连接...
下面我们将详细探讨这些关键的jar包以及它们在Ibatis与Oracle连接中的作用。 1. **ibatis-2.3.3.jar**: 这是Ibatis框架的核心库,包含了Ibatis的主要组件和API。它提供了SQL映射文件解析、事务管理、数据源配置等...
ibatis 读取oracle clob类型
与传统的JDBC相比,iBatis简化了SQL的编写和执行,同时避免了手动管理连接和结果集。在iBatis中,SQL语句被定义在XML配置文件或注解中,与Java代码解耦。通过Mapper接口,开发者可以在服务层调用这些SQL语句,实现...
例如,通过WHERE ROWNUM BETWEEN start AND end限制返回的结果集范围。同时,可以结合索引来进一步优化查询性能,尤其是在处理大数据量时。此外,Oracle的Materialized Views(物化视图)可以在后台预先计算并存储...