iBatis调用返回两个游标的存储过程处理方法
2013-08-08 09:15
405 查看
遇到这么一个问题,需要通过Ibatis调用一个返回两个游标的存储过程。在网上找资料来着,发现问此问题的挺多的,但难以找到解决方案,于是,估摸着调用返回一个游标的存储过程处理方式,整出了调用返回两个游标的存储过程。现贴出来与大家共享。
举例如下:
存储过程:
[align=left]create or replace function fn_tester([/align]
[align=left] cursor_data1 out sys_refcursor ,[/align]
cursor_data2
out sys_refcursor
[align=left])[/align]
[align=left]return number[/align]
[align=left]as[/align]
[align=left] [/align]
[align=left]begin[/align]
[align=left] begin[/align]
[align=left] [/align]
open cursor_data1
[align=left] for SELECT[/align]
[align=left] e.data_1,[/align]
[align=left] e.data_2,[/align]
e.data_3 from a_table
e;
[align=left] [/align]
open cursor_data2
for
[align=left] for SELECT[/align]
[align=left] e.data_4,[/align]
[align=left] e.data_5,[/align]
e.data_6 from b_table
e;
[align=left] [/align]
[align=left]end fn_tester;[/align]
[align=left]sqlmap 写法如下:[/align]
[align=left]<!-- 游标1数据配置-->[/align]
<resultMap class="com.table1" id="result1">
<result property="data1" column="data_1"/>
<result property="data2" column="data_2"/>
<result property="data3" column="data_3"/>
</resultMap>
<!-- 游标2数据配置-->
<resultMap class="com.table2" id="result2">
<result property="data4" column="data_4"/>
<result property="data5" column="data_5"/>
<result property="data6" column="data_6"/>
</resultMap>
<!-- 调用存储过程传入参数配置-->
<parameterMap class="java.util.HashMap" id="testParam">
<parameter property="result" jdbcType="INTEGER"
javaType="java.lang.Long" mode="OUT" />
<parameter property="table1Data" jdbcType="ORACLECURSOR"
javaType="java.sql.ResultSet" resultMap="result1" mode="OUT" />
<parameter property="table2Data" jdbcType="ORACLECURSOR"
javaType="java.sql.ResultSet" resultMap="result2" mode="OUT" />
</parameterMap>
<!-- 存储过程调起-->
<procedure id="testId" parameterMap="testParam">
<![CDATA[
{? = call fn_tester(?,?)}
]]>
</procedure>
dao层数据获取:
其中table1、table2是两个pojo;
[align=left]public void getData(Map paramMap) throws SqlException {[/align]
[align=left] try {[/align]
[align=left] getSqlMapClientTemplate().queryForObject( NAMESPACE + "testId" ,paramMap);[/align]
[align=left] // 游标1获取[/align]
[align=left] List< table1> dataList1= (List<table1>)paramMap.get( "table1Data" );[/align]
[align=left] // 游标2获取[/align]
[align=left] List< table2> dataList2= (List<table2>)paramMap.get( "table2Data" );[/align]
[align=left] [/align]
} catch (SqlException e)
{
[align=left] throw e;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] System. out .println(dataList1);[/align]
[align=left] System. out .println(dataList2);[/align]
[align=left] }[/align]
自己写个测试用例就可以测试了。
举例如下:
存储过程:
[align=left]create or replace function fn_tester([/align]
[align=left] cursor_data1 out sys_refcursor ,[/align]
cursor_data2
out sys_refcursor
[align=left])[/align]
[align=left]return number[/align]
[align=left]as[/align]
[align=left] [/align]
[align=left]begin[/align]
[align=left] begin[/align]
[align=left] [/align]
open cursor_data1
[align=left] for SELECT[/align]
[align=left] e.data_1,[/align]
[align=left] e.data_2,[/align]
e.data_3 from a_table
e;
[align=left] [/align]
open cursor_data2
for
[align=left] for SELECT[/align]
[align=left] e.data_4,[/align]
[align=left] e.data_5,[/align]
e.data_6 from b_table
e;
[align=left] [/align]
[align=left]end fn_tester;[/align]
[align=left]sqlmap 写法如下:[/align]
[align=left]<!-- 游标1数据配置-->[/align]
<resultMap class="com.table1" id="result1">
<result property="data1" column="data_1"/>
<result property="data2" column="data_2"/>
<result property="data3" column="data_3"/>
</resultMap>
<!-- 游标2数据配置-->
<resultMap class="com.table2" id="result2">
<result property="data4" column="data_4"/>
<result property="data5" column="data_5"/>
<result property="data6" column="data_6"/>
</resultMap>
<!-- 调用存储过程传入参数配置-->
<parameterMap class="java.util.HashMap" id="testParam">
<parameter property="result" jdbcType="INTEGER"
javaType="java.lang.Long" mode="OUT" />
<parameter property="table1Data" jdbcType="ORACLECURSOR"
javaType="java.sql.ResultSet" resultMap="result1" mode="OUT" />
<parameter property="table2Data" jdbcType="ORACLECURSOR"
javaType="java.sql.ResultSet" resultMap="result2" mode="OUT" />
</parameterMap>
<!-- 存储过程调起-->
<procedure id="testId" parameterMap="testParam">
<![CDATA[
{? = call fn_tester(?,?)}
]]>
</procedure>
dao层数据获取:
其中table1、table2是两个pojo;
[align=left]public void getData(Map paramMap) throws SqlException {[/align]
[align=left] try {[/align]
[align=left] getSqlMapClientTemplate().queryForObject( NAMESPACE + "testId" ,paramMap);[/align]
[align=left] // 游标1获取[/align]
[align=left] List< table1> dataList1= (List<table1>)paramMap.get( "table1Data" );[/align]
[align=left] // 游标2获取[/align]
[align=left] List< table2> dataList2= (List<table2>)paramMap.get( "table2Data" );[/align]
[align=left] [/align]
} catch (SqlException e)
{
[align=left] throw e;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] System. out .println(dataList1);[/align]
[align=left] System. out .println(dataList2);[/align]
[align=left] }[/align]
自己写个测试用例就可以测试了。
相关文章推荐
- ibatis 调用存储过程返回游标sys_refcursor
- Mybaits结合Oracle调用存储过程返回游标的两种方法
- 利用游标返回结果集的的例子(Oracle 存储过程)JAVA调用方法和.NET调用方法
- php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法
- php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法
- 3.定义一个接受两个数字的方法,返回两个数字的和 →(javascript代返回值的函数的申明和调用)
- JQuery调用webservice,返回的json数据和XML数据的处理方法
- Hibernate调用mysql存储过程,返回多个参数的方法
- 基于C#中的类SqlCommand对象调用SQLServer存储过程时,存储过程执行成功,但是对象方法ExecuteNonQuery()返回-1
- SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)
- php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法
- mybatis 调用存储过程 返回游标 实例
- JDBC调用存储过程并返回游标
- oracle 动态调用存储过程,返回游标类型
- 存储过程调用存储过程,存储过程调用函数,返回表表变量,游标使用
- mybatis 调用存储过程 返回游标 实例
- ibatis调用存储过程(无返回参数)
- 调用Camera返回为空的分析及处理方法
- mybatis 调用存储过程,处理返回2个不同类型的结果集
- 简单编程(十四)定义一个方法能够判断并返回两个整数的最大值,并调用自己的方法测试是否正确。