下面介绍ibatis调用oracle的动态sql
1环境:oracle10g,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的问题。