一個關於更新Oracle中Blob問題

前幾天作項目,用到了Oracle數據庫,是關於更新Blob,代碼是這樣寫的:
 html

Java代碼 複製代碼
  1. /**   
  2.      * 描述: 添加某張表某條記錄的content字段,此字段爲 blob 型  
  3.      * param: 表名;主鍵;數據;數據庫鏈接  
  4.      * return: 添加成功返回 true ;不然返回 false  
  5.      * */  
  6.     public static boolean setBlob(String tableName,int ID, String data,Connection conn) {   
  7.         Statement statement = null;   
  8.         ResultSet ret = null;   
  9.         String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";   
  10.         boolean flg = false;   
  11.         try {   
  12.             statement = conn.createStatement();   
  13.                  ret = statement.executeQuery(insertBlob);   
  14.             oracle.sql.BLOB blob = null;   
  15.             if (ret.next()) {   
  16.                 blob = ((OracleResultSet) ret).getBLOB(1);   
  17.             }   
  18.             OutputStream outstream = blob.getBinaryOutputStream();   
  19.             byte[] data1 = data.getBytes();   
  20.             outstream.write(data1, 0, data1.length);//就是這個地方出了問題,若是是修改,以前就有了長度爲100字節的數據,而此次修改只有50字節數據,那麼後面50個字節就不會被修改,仍然存在數據庫中   
  21.             outstream.flush();   
  22.             outstream.close();   
  23.             flg = true;   
  24.         } catch (SQLException e1) {   
  25.             e1.printStackTrace();   
  26.             flg = false;   
  27.         } catch (IOException e1) {   
  28.             e1.printStackTrace();   
  29.             flg = false;   
  30.         } finally {   
  31.             try {   
  32.                 if(statement != null) {   
  33.                     statement.close();   
  34.                 }   
  35.                 if(ret != null) {   
  36.                     ret.close();   
  37.                 }   
  38.             }catch(Exception ex) {   
  39.                 ex.printStackTrace();   
  40.             }   
  41.         }   
  42.            
  43.         return flg;   
  44.     }  

 


若是你更新blob字段時,該字段爲空(好比以前剛剛插入新記錄),則這樣操做正確。
但要更新有數據的blob字段,則只能更新部分字節,原字段數據超出長度部分的字節內容不變。
若是確實須要更新有數據的blob字段(也叫覆蓋式更新),則可在下面兩種方法中選擇其一:
一、在更新前(setBlob方法中select執行前)先將blob字段清空:
\"UPDATE \" + tableName + \" SET content=EMPTY_BLOB() WHERE id= \'\" +ID + \"\'\"
再執行你的更新代碼。
二、確保每次寫入的字段長度固定。即便data的字節數少,也要保證data1的長度固定,
也即data1定義長度要與data無關。
採用第一種方案的代碼以下:
 java

Java代碼 複製代碼
  1. /**   
  2.      * 描述: 添加某張表某條記錄的content字段,此字段爲 blob 型  
  3.      * param: 表名;主鍵;數據;數據庫鏈接  
  4.      * return: 添加成功返回 true ;不然返回 false  
  5.      * */  
  6.     public static boolean setBlob(String tableName,int ID, String data,Connection conn) {   
  7.         Statement statement = null;   
  8.         ResultSet ret = null;   
  9.         String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";   
  10.         String flushBlob="update "+tableName+" set content=EMPTY_BLOB() where id="+ID;   
  11.         boolean flg = false;   
  12.         try {   
  13.             statement = conn.createStatement();   
  14.             statement.execute(flushBlob);//首先清空content字段   
  15.             ret = statement.executeQuery(insertBlob);   
  16.             oracle.sql.BLOB blob = null;   
  17.             if (ret.next()) {   
  18.                 blob = ((OracleResultSet) ret).getBLOB(1);   
  19.             }   
  20.             OutputStream outstream = blob.getBinaryOutputStream();   
  21.             byte[] data1 = data.getBytes();   
  22.             outstream.write(data1, 0, data1.length);//就是這個地方出了問題,若是是修改,以前就有了長度爲100字節的數據,而此次修改只有50字節數據,那麼後面50個字節就不會被修改,仍然存在數據庫中   
  23.             outstream.flush();   
  24.             outstream.close();   
  25.             flg = true;   
  26.         } catch (SQLException e1) {   
  27.             e1.printStackTrace();   
  28.             flg = false;   
  29.         } catch (IOException e1) {   
  30.             e1.printStackTrace();   
  31.             flg = false;   
  32.         } finally {   
  33.             try {   
  34.                 if(statement != null) {   
  35.                     statement.close();   
  36.                 }   
  37.                 if(ret != null) {   
  38.                     ret.close();   
  39.                 }   
  40.             }catch(Exception ex) {   
  41.                 ex.printStackTrace();   
  42.             }   
  43.         }   
  44.            
  45.         return flg;   
  46.     }  

感受這個不錯~ 出處:http://andy99.javaeye.com/blog/476814sql

相關文章
相關標籤/搜索