成熟丰满熟妇高潮XXXXX,人妻无码AV中文系列久久兔费 ,国产精品一国产精品,国精品午夜福利视频不卡麻豆

您好,歡迎來到九壹網(wǎng)。
搜索
您的當(dāng)前位置:首頁jdbc中如何處理OracleBLOB字段

jdbc中如何處理OracleBLOB字段

來源:九壹網(wǎng)

一般人會走哪些彎路? 1.使用jdk中的方法進(jìn)行傳輸。在ResultSet 中有g(shù)etBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數(shù)人都會嘗試setBlob (),getBlob() 進(jìn)行讀寫,或者兩個數(shù)據(jù)庫之間BLOB的傳輸。這種方法實際上是行不通的,據(jù)網(wǎng)上的一些資

一般人會走哪些彎路?
1.使用jdk中的方法進(jìn)行傳輸。在ResultSet 中有g(shù)etBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數(shù)人都會嘗試setBlob

(),getBlob() 進(jìn)行讀寫,或者兩個數(shù)據(jù)庫之間BLOB的傳輸。這種方法實際上是行不通的,據(jù)網(wǎng)上的一些資料介紹,說sun官方的文檔有些方法

都是錯誤的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream對BLOB進(jìn)行讀寫或兩個數(shù)據(jù)庫間的傳輸。這種方法我自己嘗試過,

發(fā)現(xiàn),如果BLOB中存儲的是文本文件的話,就沒問題,如果是二進(jìn)制文件,傳輸就會有問題。

根據(jù)自己的經(jīng)驗,以及查閱了Oracle的官方文檔,都是使用如下處理方法:
1.新建記錄,插入BLOB數(shù)據(jù)
1.1首先新建記錄的時候,使用oracle的函數(shù)插入一個空的BLOB,假設(shè)字段A是BLOB類型的:
insert xxxtable(A,B,C) values(empty_blob(),'xxx','yyyy')
1.2后面再查詢剛才插入的記錄,然后更新BLOB,在查詢前,注意設(shè)置Connection的一個屬性:
conn.setAutoCommit(false);如果缺少這一步,可能導(dǎo)致fetch out of sequence等異常.
1.3 查詢剛才插入的記錄,后面要加“ for update ”,如下:
select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出現(xiàn)row containing the LOB value is not locked

的異常
1.4 從查詢到的 BLOB字段中,獲取blob并進(jìn)行更新,代碼如下:
BLOB blob = (BLOB) rs.getBlob("A");
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os);

后面再使用output.write方法將需要寫入的內(nèi)容寫到output中就可以了。例如我們將一個文件寫入這個字段中:
BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件寫入的緩沖
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代碼就是從input里2k地讀取,然后寫入到output中。
1.5上面執(zhí)行完畢后,記得關(guān)閉output,input,以及關(guān)閉查詢到的ResultSet
1.6最后執(zhí)行conn.commit();將更新的內(nèi)容提交,以及執(zhí)行conn.setAutoCommit(true); 改回Connction的屬性
2.修改記錄,方法與上面的方法類似,
2.1首先更新BLOB以外的其他字段
2.2 使用1.3中類似的方法獲取記錄
2.3 修改的過程中,注意以下:a 需要更新的記錄中,BLOB有可能為NULL,這樣在執(zhí)行blob.getBinaryOutputStream()獲取的È可能為

null,那么就關(guān)閉剛才select的記錄,再執(zhí)行一次update xxxtable set A = empty_blob() where xxx, 這樣就先寫入了一個空的BLOB(不是null),然后再

使用1.3,1.4中的方法執(zhí)行更新記錄.b 注意別忘了先執(zhí)行setAutoCommit(false),以及"for update",以及后面的conn.commit();等。
3.讀取BLOB字段中的數(shù)據(jù).
3.1 讀取記錄不需要setAutoCommit(),以及 select ....for update.
3.2 使用普通的select 方法查詢出記錄
3.3 從ResultSet中獲取BLOB并讀取,如下:
BLOB b_to = (BLOB) rs.getBlob("A");
InputStream is = b_from.getBinaryStream();
BufferedInputStream input = new BufferedInputStream(is);
byte[] buff = new byte[2048];
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
//在這里執(zhí)行寫入,如寫入到文件的BufferedOutputStream里
System.out.println(bytesRead);
}
通過循環(huán)取出blob中的數(shù)據(jù),寫到buff里,再將buff的內(nèi)容寫入到需要的地方
4.兩個數(shù)據(jù)庫間blob字段的傳輸
類似上面1和3的方法,一邊獲取BufferedOutputStream,另外一邊獲取BufferedInputStream,然后讀出寫入,需要注意的是寫入所用的

Connection要執(zhí)行conn.setAutoCommit(false);以及獲取記錄時添加“ for update ”以及最后的commit();

總結(jié)以上方法,其根本就是先創(chuàng)建空的BLOB,再獲取其BufferedOutputStream進(jìn)行寫入,或獲取BufferedInputStream進(jìn)行讀取

2007-6-23 19:45:02
查看評語???

2007-6-23 19:48:30 java語言操作Oracle數(shù)據(jù)庫中的CLOB數(shù)據(jù)類型字段類型:blob,clob,nclob
  說明:三種大型對象(LOB),用來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件,最大長度是4GB。LOB有幾種類型,取決于你使用的字節(jié)的類型,Oracle 8i實實在在地將這些數(shù)據(jù)存儲在數(shù)據(jù)庫內(nèi)部保存??梢詧?zhí)行讀取、存儲、寫入等特殊操作。
  
  我們所操作的clobtest_table中屬性是(字符型id,CLOB型picstr),目前我們假設(shè)一個大的字符對象str已經(jīng)包含了我們需要存入picstr字段的數(shù)據(jù)。而且connection對象conn已經(jīng)建立。以下的例子程序也因為不想占用太多的空間,所以對拋出異常沒有寫。大家參考一下api doc。就可以知道該拋出什么異常了,此處僅僅告訴大家如何去寫。
  
  代碼:
  
  
  (1)對數(shù)據(jù)庫clob型執(zhí)行插入操作
  *************************************************
  
  java.sql.PreparedStatement pstmt = null;
  ResultSet rs = null;
  String query = "";
  
  conn.setAutoCommit(false);
   query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";
  java.sql.PreparedStatement pstmt = conn.prepareStatement(query);
  pstmt.setString(1,"001");
  pstmt.executeUpdate();
  pstmt = null
   query = "select picstr from clobtest_table where id = '001' for update";
  pstmt = con.prepareStatement(query)
  rs= pstmt.executeQuery();
  
  oracle.sql.CLOB clobtt = null;
  if(rs.next()){
   clobtt = (oracle.sql.CLOB)rs.getClob(1);
  }
  Writer wr = clobtt.getCharacterOutputStream();
  wr.write(strtmp);
  wr.flush();
  wr.close();
  rs.close();
  con.commit();
  
  
  
 ?。?)通過sql/plus查詢是否已經(jīng)成功插入數(shù)據(jù)庫
  *************************************************
  
  PL/SQL的包DBMS_LOB來處理LOB數(shù)據(jù)。察看剛才的插入是否成功。使用DBMS_LOB包的getlength這個procedure來檢測是否已經(jīng)將str存入到picstr字段中了。如:
  
  SQL> select dbms_lob.getlength(picstr) from clobtest_table;
  
  
  (3)對數(shù)據(jù)庫clob型執(zhí)行讀取操作
  *************************************************
  
  讀取相對插入就很簡單了。基本步驟和一半的取數(shù)據(jù)庫數(shù)據(jù)沒有太大的差別。
  String description = ""
   query = "select picstr from clobtest_table where id = '001'";
  pstmt = con.prepareStatement(query);
  ResultSet result = pstmt.executeQuery();
  if(result.next()){
   oracle.jdbc.driver.OracleResultSet ors =
   (oracle.jdbc.driver.OracleResultSet)result;
   oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);
  
   if(clobtmp==null || clobtmp.length()==0){
   System.out.println("======CLOB對象為空 ");
   description = "";
   }else{
   description=clobtmp.getSubString((long)1,(int)clobtmp.length());
   System.out.println("======字符串形式 "+description);
   }

  }

Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號-2

違法及侵權(quán)請聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)