论坛首页 Java企业应用论坛

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

浏览 3414 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-03   最后修改:2009-04-07

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的问题。

   发表时间:2009-04-03  
我记得不错的话,这样执行ORACLE本身对SQL语句的长度也是有限制的。
0 请登录后投票
   发表时间:2009-04-03  
memphis 写道
我记得不错的话,这样执行ORACLE本身对SQL语句的长度也是有限制的。

ORACLE的SQL语句的长度是有限制的
0 请登录后投票
   发表时间:2009-04-03  
用jdbc执行sql语句,并不是调用oracle的系统函数来执行的!jdbc对sql的长度限制是多少其实我也不敢确定!网上有说是128的,但是jdbc的限制要比oracle的要大!这个是可以肯定的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics