ibatis procedure

Solution 1

This is sample mapping for a Stored procedure which return Ref cursor in it's out parameter

<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
    
    <sqlMap namespace="KOMUNIKA_REPORT">
    <resultMap id="BaseResultMap" class="javaapplication4.StockAreaAndWarehouse" >
    <result column="PRODUCT_CODE" property="productCode"  />
    <result column="PRODUCT_NAME" property="productName" />
    <result column="INCOMING" property="incoming" />
    <result column="UNIT_SOLD" property="unitSold" />
    <result column="TOTAL_STOCK" property="totalStock" />
    </resultMap>
    <parameterMap id="resultMap" class="java.util.Map">
    <parameter property="result" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT"/>
    </parameterMap>
    <procedure id="selectStockAreaAndWarehouse"
    parameterMap="resultMap"
    resultMap="BaseResultMap"
    >
    { call KOMUNIKA.LP_STOCK_AREA_WAREHOUSE(?) }
    </procedure>
    </sqlMap>

You should aware that javaType="java.sql.ResultSet" attribute must set to be able to map result to a Class, if it not set than your effort is a waste (like mine )

Oracle's PL/SQL Stored procedure

CREATE OR REPLACE PROCEDURE KOMUNIKA.LP_STOCK_AREA_WAREHOUSE(
    RESULT_CURSOR out TYPES.ref_cursor) as
    BEGIN
    OPEN RESULT_CURSOR FOR select PRODUCT_CODE, PRODUCT_NAME, INCOMING, UNIT_SOLD, TOTAL_STOCK
    from KOMUNIKA.STOCK_AREA_AND_WAREHOUSE ;
    END LP_STOCK_AREA_WAREHOUSE;

To make that PL/SQL work you should declare a package so that TYPES.ref_cursor recognized by oracle

CREATE OR REPLACE PACKAGE KOMUNIKA.Types
    AS
    TYPE ref_cursor IS REF CURSOR;
    END;

To test wether it works or not you need sqlMapConfig

<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
    <sqlMapConfig>
    <settings useStatementNamespaces="true" classInfoCacheEnabled="true" />
    <transactionManager type="JDBC" >
    <dataSource type="SIMPLE">
    <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
    <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
    <property name="JDBC.Username" value="YOUUSERHERE"/>
    <property name="JDBC.Password" value="YOURPASSWORDHERE"/>
    <property name="JDBC.DefaultAutoCommit" value="true" />
    </dataSource>
    </transactionManager>
    <sqlMap resource="javaapplication4/KOMUNIKA_REPORT_SqlMap.xml" />
    </sqlMapConfig>

oh, one more setting which is realy important is useStatementNamespaces="true", i find it out in a hardway when i want to use namespace

At last here is Java code used to test the configuration. This java code derived from improvement solution below,

Main.java
package javaapplication4;
    
    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    import java.io.Reader;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
    *
    * @author ifnu<mailto:ifnubima@gmail.com>
    */
    public class Main {
    public static void main(String[] args) throws Exception {
    String resource;
    Reader reader;
    List list;
    SqlMapClient sqlMap;
    resource = "javaapplication4/ibatis.xml";
    reader = Resources.getResourceAsReader (resource);
    sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
    Map map = new HashMap();
    // use queryForList because the procedure map defines a resultmap
            // for the statement
            list = sqlMap.queryForList("KOMUNIKA_REPORT.selectStockAreaAndWarehouse", map);
    System.out.println(list);
    }
    }

you can download the code above : http://opensource.atlassian.com/confluence/oss/download/attachments/561/iBatisCallSpRefCursorOracle.zip

Solution 2

...http://huodong.duomi.com/music_303029713_Listen.html

Improving the Solutions

If you have an idea to improve one of the solutions above, but it requires a change to the iBATIS framework, put it here.

Improvement 1

I have modified the framework to allow all oracle cursors to be mapped by a statement's resultMap so you can call the queryForList() method and have the oracle cursor results returned in the list. I also added the ability to specifiy a resultMap to use with each of the oracle cursor parameters to support the queryForObject() call. I have tested this code with IBATIS 2.1.6.598

here are my sample sqlMap:

<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
    
    <sqlMap>
    
    <typeAlias alias="Employee" type="test.Employee" />
    
    <resultMap id="employee-map" class="Employee">
    <result property="name" column="ENAME" />
    <result property="employeeNumber" column="EMPNO" />
    <result property="departmentNumber" column="DEPTNO" />
    </resultMap>
    
    <parameterMap id="single-rs" class="map" >
    <parameter property="in1" jdbcType="int" javaType="java.lang.Integer" mode="IN"/>
    <parameter property="output1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT"/>
    </parameterMap>
    
    <procedure id="GetSingleEmpRs" parameterMap="single-rs" resultMap="employee-map">
    { call scott.example.GetSingleEmpRS(?, ?) }
    </procedure>
    
    <parameterMap id="double-rs" class="map" >
    <parameter property="in1" jdbcType="int" javaType="java.lang.Integer" mode="IN"/>
    <parameter property="output1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="employee-map" />
    <parameter property="output2" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="employee-map" />
    </parameterMap>
    
    <procedure id="GetDoubleEmpRs" parameterMap="double-rs" >
    { call scott.example.GetDoubleEmpRS(?, ?, ?) }
    </procedure>
    </sqlMap>

Here is my sample code that makes use of the maps:

Main.java
package test;
    import java.io.Reader;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    
    public class Main {
    
    
    public static void main(String arg[]) throws Exception {
    String resource;
    Reader reader;
    List list;
    SqlMapClient sqlMap;
    resource = "test/SqlMapConfig.xml";
    reader = Resources.getResourceAsReader (resource);
    sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
    Map map = new HashMap();
    map.put("in1", new Integer(10));
    // use queryForList because the procedure map defines a resultmap
    	        // for the statement
    	        list = sqlMap.queryForList("GetSingleEmpRs", map);
    
    System.out.println("--------------------");
    System.out.println( list );
    System.out.println("--------------------");
    
    map = new HashMap();
    map.put("in1", new Integer(10));
    // use queryForObject because the procedure map does not define a
    	        // result map for the statement
    	        sqlMap.queryForObject("GetDoubleEmpRs", map);
    
    System.out.println("--------------------");
    System.out.println( map.get("output1"));
    System.out.println( map.get("output2"));
    System.out.println("--------------------");
    
    
    }
    }

Here is the output from Main.java

    --------------------
    [Employee[name=CLARK,id=7782,dept=10], Employee[name=KING,id=7839,dept=10], Employee[name=MILLER,id=7934,dept=10]]
    --------------------
    --------------------
    [Employee[name=CLARK,id=7782,dept=10], Employee[name=KING,id=7839,dept=10], Employee[name=MILLER,id=7934,dept=10]]
    [Employee[name=ADAMS,id=7876,dept=20], Employee[name=ALLEN,id=7499,dept=30], Employee[name=BLAKE,id=7698,dept=30],
    Employee[name=FORD,id=7902,dept=20], Employee[name=JAMES,id=7900,dept=30], Employee[name=JONES,id=7566,dept=20],
    Employee[name=MARTIN,id=7654,dept=30], Employee[name=SCOTT,id=7788,dept=20], Employee[name=SMITH,id=7369,dept=20],
    Employee[name=TURNER,id=7844,dept=30],Employee[name=WARD,id=7521,dept=30]]
    --------------------
    

All test code and modified src are included in this page's attachments. Most of my PL/SQL code just returns a single ref cursor so it is nice just to define a resultMap for the statement and just have it work automatically with a queryForList() call. The second form handles the more complicated case of returning two or more cursors. I have tested this code with oracle 9i using the thin driver (ojdbc14.jar) with jdk 1.4

 http://huodong.duomi.com/music_303029713_Listen.html

http://www.apachebookstore.com/confluence/oss/display/IBATIS/Oracle+REF+CURSOR+Solutions

05 - GRACE数据处理-球谐展开与球谐综合 GRACE数据处理-球谐展开和综合前面在介绍GRACE相关理论的时候提到过下面的公式,从公式形式上可以看出,面密度变化和球谐系数(CS)之间是能够相互转换的,那这个转化的过程可以称为球谐展开,简单理解就是将全球网格数据转化为球谐系数的过程。而球谐综合可以看作是球谐展开的逆过程,利用球谐系数计算到全球格网分布。 阅读详情

相关推荐

IBATIS调用存储过程

IBATIS调用存储过程

iBatis procedure

一、创建procedure(mysql)

jjavaboy的专栏 2675

CTF线下AWD脚本合集.zip

1.CTF线下AWD脚本合集2.适合网络攻防CTF小白脚本小子,比赛快速拿分3.适合懒得自己动手编写脚本人群

ibatis 中调用存储过程

存储过程的概念:               存储过程是数据库将一组完成特定功能的Sql语句进行编译,每次调用时不必重新编译,因此执行速度和效率都比直接使用Sql语句有很大优势。在Ibatis中通过&lt;procedure&gt;标签元素可以直接调用数据库的存储过程,其实现过程如下: (1).定义存储过程所需输入/输出参数,如:       1 2 3 4 ...

毛兔记录:工作小技巧、遇到的一些典型bug、问题汇总、小知识。 550

Ibatis学习笔记

1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate、Toplink等在java编程的对象持久化方面深受开发人员欢迎。对象关系映射(ORM):简单原理是通过面向对象方式操作关系型数据库,目前存储数据最常用最流行的工具是关系型数据库,其操作方式是通过SQL语句操作数据库的表,但是对于Java面向对象编程语言中,所有的操作对象都是对象,因此对象关系映射就是把数据库表和java编程语言中的对象对应起来,把表的列同java对象中的字段对应起来,程

Tony Chen的专栏 1万+

Ibatis调用存储过程(笔记)

      众所周知,Ibatis的核心就在于映射文件(Data Map XML File),在调用存储过程返回取得返回参数的过程中,最有可能出错的地方,就是映身文件的配置.      调用存储过程只能用到&lt;procedure&gt;(当然,我在博客园也见到一些朋友介绍说可以使用&lt;statement&gt;标签,但经过小弟在测试调用Oracle数据库一直报错String类型没有长度限...

亮星空 195

ibatis 调用存储过程

4.Procedure procedure 元素支持存储过程。大部分存储过程要一些类似IN, INOUT 或者 OUT 的参数。所以,创建一个 &lt;parameterMap&gt; 元素并列出你要向存储过程传递的参数。只有当参数类型为OUT或者INOUT时parameterMap 对象才会被改变。 &lt;parameterMap id="swapParameters" class...

pearson 145

IBATISprocedure传入自定义类型

Java端有Class TypeA的某类型,现在需要把它作为参数,传给后台oracle数据库的一个procedure,而数据库端也定义了与此类同样结构的自定义TypeB。步骤: 1. 定义实现了java.sql.SQLData的类Class TypeA。实现getSQLTypeName方法,返回值为数据库的自定义类型名。实现readSQL 方法时要注意,读sql字段的顺序要与Class Typ

Project Architect的专栏 1765

ibatis2.0使用procedure

之前的公司是互联网基本上会规避procedure这种东西,有的话也会是比较简单的实现.到了新公司全部使用procedure(原因不详,个人觉得是拍脑袋决定).ibatis2 2.1.7.597版本中的dtd有bug,会直接导致无法识别parameterMap标签下子标签resultMap!而是用比较高的版本会有jdbcType="ORACLECURSOR"无法支持的情况!后来发现使用2.3.4.7...

crazy java 603

ibatis调用Oracleprocedure和function

. 一、调用存储过程 Oracle代码 procedure proc_pos_check(p_gtin  in varchar2,                            p_safe_code   in varchar2,                            p_in_sell_id  in varchar2,                    

在你最感兴趣的事物上,隐藏着你人生的秘密 3019

iBATIS SQL 2000 procedure

sqlMap: jdbcType="VARCHAR" mode="INOUT" /> {call duankoo_validKooBei(?,?)} javaCode: public String applyKoBei(Integer userId) { String rtnStr = ""; HashMap map = new HashMap(); ma

guolong1983811的专栏 473

call mysql store procedure in ibatis with spring

[b]call mysql store procedure in ibatis with spring[/b] 1.sqlmap文件编写 1)无参存储过程 [code="java"] {call test} [/code] 2)有参存储过程 1)无out参数 [code="java"] ...

leiliang 218

ibatis相关知识

Mapped statement   iBATIS SQL Maps 的核心概念就是 Mapped statement!Mapped Statement 可以使用任意的 SQL 语句,利用 POJO、原始变量及其 Wrapper Class 作为输入(parameter class)和输出(result class)。   Mapped Statement 包含以下几种类型:   ...

博“文”强识 123

ibatis调用存储过程

ibatis xml中 <!-- 调用存储过程来生成考生试卷 --> <parameterMap class="java.util.HashMap" id="examinee" > <parameter property="result" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/&g...

269

ibatis的remapResults属性合理运用

Proper Usage of remapResults="true" The remapResults attribute is available on 【statement】, 【select】, and 【procedure】 mapped statements. It is an optional attribute and the default value is false. T...

A2k 188

Mybatis 学习

关于MybatisMybatis是Apache项目的一个开源框架,前名为ibatis,2010年更名为mybatis.它是一个轻量级的持久层框架。之所以说它是一个轻量级的持久层框架主要是它区别于其他持久层框架比如(Hibernate、EJB)等,它强调的是使用SQL,而其它框架需要自定义查询语言,比如HQL、EJB QL等。设计理念 简单:其被广泛的认为是可用的最简单的持久层框架之一 快速开发:其理

鲍旭良 459

iBatis简单介绍

1.Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate、Toplink等在java编程的对象持久化方面深受开发人员欢迎。 对象关系映射(ORM):简单原理是通过面向对象方式操作关系型数据库,目前存储数据最常用最流行的工具是关系型数据库,其操作方式是通过 SQL语句操作数据库的表,但是对于Java面向对象编程语言中,所有的...

weixin_34376986的博客 1040

Oracle存储过程详解(四)-ibatis中调用

有一个”删除部门”的任务,删除部门的时候要先查看该部门是否还有员工,有员工就不能删除,没有就可以删除。 参考资料:普通存储过程(无集合的参数)1. 编写存储过程:--删除一个部门(返回false或0:删除失败 返回true或1:删除成功 不建议使用boolean类型 jdbc不支持) create or replace procedure delDept(dno in number,isdelete

天外来客的博客 5082

ibatis xml 调用存储过程案例

sqlMap>-- eg) }-->) }) }) }) }) }) }) }) }) }

m0_38061183的博客 869
上一篇: 关于复选框的一小点发现
下一篇: ORA-12154: TNS: 无法解析指定的连接标识符
lanapple123
博客等级 码龄17年 0粉丝 39原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值