ibatis调用oracle的动态sql,sql大小不能超过32K

1环境:oracle10g,spring2.5,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的问题。

你可能感兴趣的:(oracle,sql,ibatis,jdbc,orm)