乙個關於更新Oracle中Blob問題

2021-08-30 05:42:01 字數 1853 閱讀 1043

前幾天做專案,用到了oracle資料庫,是關於更新blob,**是這樣寫的:

/** 

* 描述: 新增某張表某條記錄的content欄位,此字段為 blob 型

* param: 表名;主鍵;資料;資料庫連線

* return: 新增成功返回 true ;否則返回 false

* */

public static boolean setblob(string tablename,int id, string data,connection conn)

outputstream outstream = blob.getbinaryoutputstream();

byte data1 = data.getbytes();

outstream.write(data1, 0, data1.length);//就是這個地方出了問題,如果是修改,之前就有了長度為100位元組的資料,而這次修改只有50位元組資料,那麼後面50個位元組就不會被修改,仍然存在資料庫中

outstream.flush();

outstream.close();

*** = true;

} catch (sqlexception e1) catch (ioexception e1) finally

if(ret != null)

}catch(exception ex)

}return ***;

}

如果你更新blob欄位時,該字段為空(比如之前剛剛插入新記錄),則這樣操作正確。

但要更新有資料的blob欄位,則只能更新部分位元組,原欄位資料超出長度部分的位元組內容不變。

如果確實需要更新有資料的blob欄位(也叫覆蓋式更新),則可在下面兩種方法中選擇其一:

1、在更新前(setblob方法中select執行前)先將blob欄位清空:

\"update \" + tablename + \" set content=empty_blob() where id= \'\" +id + \"\'\"

再執行你的更新**。

2、確保每次寫入的字段長度固定。即使data的位元組數少,也要保證data1的長度固定,

也即data1定義長度要與data無關。

採用第一種方案的**如下:

/** 

* 描述: 新增某張表某條記錄的content欄位,此字段為 blob 型

* param: 表名;主鍵;資料;資料庫連線

* return: 新增成功返回 true ;否則返回 false

* */

public static boolean setblob(string tablename,int id, string data,connection conn)

outputstream outstream = blob.getbinaryoutputstream();

byte data1 = data.getbytes();

outstream.write(data1, 0, data1.length);//就是這個地方出了問題,如果是修改,之前就有了長度為100位元組的資料,而這次修改只有50位元組資料,那麼後面50個位元組就不會被修改,仍然存在資料庫中

outstream.flush();

outstream.close();

*** = true;

} catch (sqlexception e1) catch (ioexception e1) finally

if(ret != null)

}catch(exception ex)

}return ***;

}

oracle批量更新乙個表中的乙個字段

最近遇到乙個sql問題。老大們讓我把乙個表中的一列資料做更新。更新的內容和對照表有給提供。後來仔細檢視資料 總結出這樣的sql 語句。update 更新表 b set b.需要更新的字段 select a.參考更新字段 from 對照表 a where a.對照表舊欄位 b.更新表需要更新的字段 注...

乙個關於oracle日誌中乙個小點的總結

下午巡檢oracle資料庫,在檢視alert log時發現乙個沒見過的東西,如下 logminer krvxpsr summary for session 2147483905 logminer startscn 0 logminer endscn 0 logminer highconsumedsc...

Oracle中關於樹遞迴的乙個sql分析

總的 select distinct t.id tenantid,t.name,ts.scnames,ts.scids,t.remark from pm tenant t inner join select tenantid,max substr scnames,2 scnames,max取scna...