1环境:oracle10g,ibatis2.3.- m5 d! M+ t& ]6 t
2由于项目里面要调用oracle的存储过程,原本采用如下方法调用:
X3 Z: H) h8 b; u {call ?=Tlgadmin.check(?,?)}
7 F$ m, n8 ^) P 但实际上是会报异常:提示oracle的动态sql语句太长。后来由数据库小组得知:动态sql的大小是有限制的。大小不能超过32K。* g: t7 }# W" a+ X7 F
既然oracle自己不能执行那么长的sql,实际的调用办法:用jdbc 来调用:应为代码是存在数据里的,所以首先先把它取出来,然后用jdbc 来调用。6 |" S' C, Z6 `. Y# u2 ?4 }
A取出类型为CLOB的sql,配置文件这么写的:; b0 ^; }; T; Q
; ~! V; X( h0 H+ }, s6 e
# R$ {2 t+ y5 Z* R) N d3 h 0 f9 V% ~: n. }
! W! M6 z- c4 p" n' C
/ @9 _6 ]5 a7 N$ }/ e/ D
/ N1 L% w; r6 {4 f7 A $ h( p! S9 \5 [/ ]0 O7 w
; y' c( f- C0 d- H6 p
% n* _' |; ^ [( M+ C( u
2 }/ l1 \7 E- D9 @6 h ?1 U2 }7 N 9 _) d7 F* y# y4 } d4 f
: f( H" K! d5 q: v) {5 P9 n
select id,owner,name,otype,status,code,opseq,optype,optime,dbid from mc$$asset_recycle_code where id=? and dbid=? 6 U4 n: V) h# W
B java代码:取出CLOB,然后用jdbc执行。
/ a% L! C- e! p. I2 i* G public RecycleCode showColobByIdAndRecoving(Map map) {' [* w7 N3 r% Y: U0 X
RecycleCode code = (RecycleCode) this.getSqlMapClientTemplate(), l9 A# G) y8 D Q* B& L
.queryForObject(“RecycleCode_showClobDetailById”, map);
0 C2 D+ r: {$ m7 P+ \5 ~0 l Connection con = null;
$ U6 k) Q5 h2 C x9 F Statement st = null;
8 n+ k; C4 R; u# `" i( _( ~: ~ try {
* P/ I* n# }. q/ S" |. z: `' @) p5 e con = this.getSqlMapClientTemplate().getDataSource() .getConnection();; l5 x/ T+ w9 D" c5 o
st = con.createStatement();/ W* r. I1 c- Z/ l+ W8 ^
st.execute(code.getCode());; H$ C7 N' r5 k2 j; x
} catch (SQLException e) {
& T" i/ f, j* _9 r% m e.printStackTrace();
1 q- p1 ?, q& x( m* v* k } finally {
$ z1 d$ Y: |! G3 t& c( d; X8 Q try {7 e5 X! w" u/ z. a
st.close(); con.close();
; A( Q! u1 L; r } catch (SQLException e) {
' F9 e* R/ ?. P8 V6 b3 W e.printStackTrace();
' N6 o r. v8 I0 c. k5 |: Y }' ]) O2 K5 H, y
}
& C ~7 j+ d0 x: d' } return code;
" a- y7 v% D2 v+ Z }
$ s1 [+ B) A" R2 E7 s4 d 这样就可以解决oracle执行动态sql大小不能超过32k的问题。 |