1环境:oracle10g,ibatis2.3.# ^% r* N1 w3 l1 _- Q
2由于项目里面要调用oracle的存储过程,原本采用如下方法调用:
; s# g i5 H) N+ }8 z/ M m1 H {call ?=Tlgadmin.check(?,?)}
0 R& ~& f; Y( _* A# ^. W$ }+ E$ \% | 但实际上是会报异常:提示oracle的动态sql语句太长。后来由数据库小组得知:动态sql的大小是有限制的。大小不能超过32K。
" x/ e5 z/ d* K& m8 }, M3 K. C0 | 既然oracle自己不能执行那么长的sql,实际的调用办法:用jdbc 来调用:应为代码是存在数据里的,所以首先先把它取出来,然后用jdbc 来调用。
) |; \. s# R b4 k2 }$ W3 W; w1 y A取出类型为CLOB的sql,配置文件这么写的:6 x7 i. r9 O; W: _. D8 _2 u! Z" G
; P$ H5 F' F- I0 ~0 D, ~0 b1 j : ~/ j$ C( ]8 {( r! S
* U7 |. D1 ?! S. V3 [3 }; ~
/ B) Y3 U, U1 ?" T5 `( m6 W4 X: t
" v/ O) F `, q% l
7 G7 j* k I# ?1 Y) f8 a' j 6 F& V+ Y, e/ ^! ]: A0 C6 V6 G
0 B* X3 T7 L- J
- e/ }1 k& T) U/ `7 e/ q9 r3 K) X8 F 0 y: p2 e, U/ a: l- k( Y+ @
6 p% |* B) v, e8 i3 v9 l
' H0 x6 _$ Q- @2 f7 L
select id,owner,name,otype,status,code,opseq,optype,optime,dbid from mc$$asset_recycle_code where id=? and dbid=?
: p7 l% ~1 ^: U. c! O B java代码:取出CLOB,然后用jdbc执行。
# U$ b7 b S% }& G public RecycleCode showColobByIdAndRecoving(Map map) {* `" C2 T" t& y8 E( P
RecycleCode code = (RecycleCode) this.getSqlMapClientTemplate()
2 c% G% ^; @" D j3 X .queryForObject(“RecycleCode_showClobDetailById”, map);
3 ~; C! l! T7 G Connection con = null;7 M/ J P$ I4 ]3 ]. p' G
Statement st = null;, s! K. X [; `- x* i$ C t6 O6 t0 p: t
try {
, _2 F3 o4 A; p- o- [$ r con = this.getSqlMapClientTemplate().getDataSource() .getConnection();
2 b% @: D" Q) k6 |5 Q$ d st = con.createStatement();/ \( u) `1 y: G5 u, G& r
st.execute(code.getCode());+ i# F) e ]0 j* _; h5 E
} catch (SQLException e) {
. F3 r& G) v, p0 Q+ c e.printStackTrace();
( f9 Z7 K8 d) v# U5 N& D } finally {$ x; K y$ T3 u( z) |! E% O
try {
' r- ?0 P$ [- l4 t* D! W! a st.close(); con.close();
: o# c5 O( a; ?- Z' o# q } catch (SQLException e) {% g% d6 f3 P: E# |
e.printStackTrace();; |# w0 I( s7 r- s( v9 U
}" C: e& k. B- K7 T, N! q: ]
}' O& U. [5 e( p" v/ J7 _6 W) e& {# s
return code;' m3 b( E% ~4 r
}( ?5 \6 j4 k" Q( j' d m
这样就可以解决oracle执行动态sql大小不能超过32k的问题。 |