我试了几个,得出结论:
java程序,无法直接用ibatis调动oracle传入clob参数的存储过程,而只能将clob参数插入数据库表的字段,插入时直接传入String参数就可以,所以,标题应该这么解决:
1.将clob字段先插入数据库中建有clob字段的临时表
2.存储过程中从表中将clob字段取出使用。
我的代码如下:
oracle数据库建表:
create table t_temp_sendbatchfj(
rightcodes clob,
errorcodes clob,
clientid varchar2(20),
mainid varchar2(20));
java代码(其中erroecodes和rightcodes都是要使用的clob字段,从ibatis传入时直接传String类型即可传入oracle的clob字段):
Map p_pro = new HashMap();
//由于java无法调用in_clob的存储过程,所以先将clob插入表,然后再从表中取出clob供存储过程用
p_pro.put("errorcodes", errorcodes.toString());
p_pro.put("rightcodes", rightcodes.toString());
p_pro.put("clientid", (String)p.get("clientid"));
p_pro.put("mainid", (String)p.get("mainid"));
dao.getSqlMapClientTemplate().insert("sendmsg.sendbatchfj_insert", p_pro);
//调用分表的存储过程
dao.getSqlMapClientTemplate().update("sendmsg.proc_p_sendbatch1", p_pro);
insert into t_temp_sendbatchfj (
rightcodes,errorcodes,clientid,mainid
)
values (
#rightcodes#,#errorcodes#,#clientid#,#mainid#
)
{ call p_sendbatch1(#clientid#,#mainid#)}
存储过程中clob的使用:
create or replace procedure p_sendbatch1(in_clientid in varchar2,in_mainid in varchar2)
--clientid在反条数时用,mainid在查正确错误id时用
as
in_right clob;
in_error clob;
begin
select errorcodes,rightcodes into in_error,in_right from t_temp_sendbatchfj where mainid=in_mainid;
....
--删除clob
delete from t_temp_sendbatchfj where mainid=in_mainid;
end;