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

本文介绍了在Oracle 10g环境中,使用Spring 2.5和iBatis 2.3调用存储过程时遇到的动态SQL长度限制问题。当SQL语句超过32K时,会出现执行异常。为解决此问题,文章提出了通过 JDBC 直接执行从数据库中取出的CLOB类型SQL的方法,详细展示了配置文件和Java代码的实现过程,从而成功规避了Oracle的动态SQL长度限制。
摘要由CSDN通过智能技术生成

1环境:oracle10g,spring2.5,ibatis2.3.

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

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

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

既然oracle自己不能执行那么长的sql,实际的调用办法:用jdbc

来调用:应为代码是存在数据里的,所以首先先把它取出来,然后用jdbc

来调用。

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

class="com.hzmc.capaa.domain.persistence.cap.RecycleCode">

typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler" />

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=?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值