ibatis调用oracle的动态sql


1环境:oracle10g,ibatis2.3.

    2由于项目里面要调用oracle的存储过程,原本采用如下方法调用:

    {call ?=Tlgadmin.check(?,?)}

    但实际上是会报异常:提示oracle的动态sql语句太长。后来由数据库小组得知:动态sql的大小是有限制的。大小不能超过32K。

    既然oracle自己不能执行那么长的sql,实际的调用办法:用jdbc 来调用:应为代码是存在数据里的,所以首先先把它取出来,然后用jdbc 来调用。

    A取出类型为CLOB的sql,配置文件这么写的:

    <resultMap id=“recycle_codeList”

    class=“com.hzmc.capaa.domain.persistence.cap.RecycleCode”>

    <result property=“id” column=“id” />

    <result property=“owner” column=“owner” />

    <result property=“name” column=“name” />

    <result property=“otype” column=“otype” />

    <result property=“status” column=“status” />

    <result property=“code” column=“code”

    typeHandler=“org.springframework.orm.ibatis.support.ClobStringTypeHandler” />

    <result property=“opseq” column=“opseq” />

    <result property=“optype” column=“optype” />

    <result property=“opTime” column=“optime” />

    <result property=“dbId” column=“dbid” />

    </resultMap>

    <select id=“RecycleCode_showClobDetailById”

    resultMap=“recycle_codeList” parameterMap=“recycleCodeMap”>

    select id,owner,name,otype,status,code,opseq,optype,optime,dbid from

    mc$asset_recycle_code where id=? and dbid=?

    </select>

    B java代码:取出CLOB,然后用jdbc执行。

    public RecycleCode showColobByIdAndRecoving(Map map) {

    RecycleCode code = (RecycleCode) this.getSqlMapClientTemplate()

    .queryForObject(“RecycleCode_showClobDetailById”, map);

    Connection con = null;

    Statement st = null;

    try {

    con = this.getSqlMapClientTemplate().getDataSource() .getConnection();

    st = con.createStatement();

    st.execute(code.getCode());

    } catch (SQLException e) {

    e.printStackTrace();

    } finally {

    try {

    st.close(); con.close();

    } catch (SQLException e) {

    e.printStackTrace();

    }

    }

    return code;

    }

    这样就可以解决oracle执行动态sql大小不能超过32k的问题。


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3