前幾天做專案,用到了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...