最近项目用到了对oracle大字段的读写,小白在这里记录下,方便自己以后用到,也希望对其他朋友有一点帮助。
由于项目的原因,这里的blob只是对xml报文的读写,并没有涉及到保存图片等,因此下面涉及的方法可能不全面,如有需要请自行查看其它大神博客。
一、读blob
这里对blob的读是直接在数据库建了一个函数Blob_To_Varchar ,这样方便项目里面其它地方用到查询blob:
CREATE
OR
REPLACE
Function Blob_To_Varchar (Blob_In In Blob) ReturnVarchar2Is
V_Varchar Varchar2(4000);
V_Start Pls_Integer :=1;
V_Buffer Pls_Integer :=4000;
BeginIf Dbms_Lob.Getlength(Blob_In) IsNullThenReturn‘‘;
EndIf;
For I In1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop
--当转换出来的字符串乱码时,可尝试用注释掉的函数--V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),‘SIMPLIFIED CHINESE_CHINA.ZHS16GBK‘, ‘AMERICAN_THE NETHERLANDS.UTF8‘));
V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start));
V_Start := V_Start + V_Buffer;
End Loop;
Return V_Varchar;
End Blob_To_Varchar;
直接在sql里面用创建的Blob_To_Varchar函数。
SELECT Blob_To_Varchar(req_tpl) as req_tpl FROM inf_xml;
二、写blob
oracle存大数据的时候,要先插入一个empty_blob()占位符,占到blob字段,其次在查询出来这个大字段用流的方式写入。
首先是插入一个empty_blob()占位符
//插入数据
int insertLogInf = this.logControllerDao.insertLogInfo(params);
if(insertLogInf > 0){
//插入大字段数据
for(int i=0;i<2;i++){
if(i == 0){
insertBlob(i,log_id,Const.getStrValue(params, "req_xml"));
}else{
insertBlob(i,log_id,rsp_xml);
}
}
}
insertBlob方法(由于要插入2个blob,又不能同时写进去,所以用比较笨的方法循环下)
public
void insertBlob(int i , String log_id ,String insertXml)throws Exception{
BLOB blobXML = null;
//查询数据
LogInterfaceXML retLogInf = this.logControllerDao.queryBlobLogInfByLogid(log_id);
if(i == 0){
blobXML = (BLOB) retLogInf.getReq_xml();
}else{
blobXML = (BLOB) retLogInf.getRsp_xml();
}
OutputStream ops = null;
try {
byte[] data = null;
ops = blobXML.setBinaryStream(0);
data = insertXml.getBytes();
ops.write(data);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(ops!=null){
ops.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里的req_xml rsp_xml 要用 Object
@Alias("logInterfaceXML")
publicclass LogInterfaceXML {
private String log_id;
private String op_code ;
private String req_time ;
private String rsp_time ;
private String ep_address ;
private String result_desc ;
privateObject req_xml ;
privateObject rsp_xml ;
public String getOp_code() {
return op_code;
}
publicvoid setOp_code(String op_code) {
this.op_code = op_code;
}
public String getReq_time() {
return req_time;
}
publicvoid setReq_time(String req_time) {
this.req_time = req_time;
}
public String getRsp_time() {
return rsp_time;
}
publicvoid setRsp_time(String rsp_time) {
this.rsp_time = rsp_time;
}
public String getEp_address() {
return ep_address;
}
publicvoid setEp_address(String ep_address) {
this.ep_address = ep_address;
}
public String getResult_desc() {
return result_desc;
}
publicvoid setResult_desc(String result_desc) {
this.result_desc = result_desc;
}
public Object getReq_xml() {
return req_xml;
}
publicvoid setReq_xml(Object req_xml) {
this.req_xml = req_xml;
}
public Object getRsp_xml() {
return rsp_xml;
}
publicvoid setRsp_xml(Object rsp_xml) {
this.rsp_xml = rsp_xml;
}
public String getLog_id() {
return log_id;
}
publicvoid setLog_id(String log_id) {
this.log_id = log_id;
}
}
对数据库的操作用的是mybatis
<
resultMap
id
="logInterfaceResultMap"
type
="logInterfaceXML"
>
<
result
property
="log_id"
column
="id"
/>
<
result
property
="op_code"
column
="op_code"
/>
<
result
property
="req_time"
column
="req_time"
/>
<
result
property
="rsp_time"
column
="rsp_time"
/>
<
result
property
="ep_address"
column
="ep_address"
/>
<
result
property
="req_xml"
column
="req_xml"
jdbcType
="BLOB"
/>
<
result
property
="rsp_xml"
column
="rsp_xml"
jdbcType
="BLOB"
/>
<
result
property
="result_desc"
column
="result_desc"
/>
</
resultMap
>
<
select
id
="queryBlobLogInfByLogid"
resultType
="logInterfaceXML"
parameterType
="string"
databaseId
="oracle"
>
select * from inf_xml c where c.log_id = #{log_id} for update
</
select
>
<
insert
id
="insertLogInfo"
parameterType
="map"
databaseId
="oracle"
>
insert into inf_xml (log_id,op_code,req_time,rsp_time,ep_address,req_xml,rsp_xml,state,result_desc)
values (#{log_id},#{op_code},to_date(#{req_time},‘YYYY-MM-DD HH24:MI:SS‘),to_date(#{rsp_time},‘YYYY-MM-DD HH24:MI:SS‘),#{ep_address},empty_blob(),empty_blob(),‘1‘,#{result_desc})
</
insert
>
可能是由于网路问题,这里写入blob的xml数据,时不时的会出现延时问题。
如果马上查询数据的话,可能不一定有数据,要等会才有数据。
具体是什么原因导致的,还在研究中,有哪位大神要是知道,可以告诉小弟一声,谢谢了。
原文:http://www.cnblogs.com/helloruijie/p/5384141.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!