2010-07-06 20 views
5

bazı toplu işlem yapmak ve Oracle veritabanında BLOB alanlarda dosyaları olarak girdi ve çıktı verileri depolamak istediğiniz. Oracle sürümü 10g r2'dir. JDBC ile büyük (veya en az belirgin olmayan) BLOB'ları Oracle'a nasıl yerleştiririm? Ben bir uygulama üzerinde çalışıyorum

veritabanına küçük bir metin dosyası ekler aşağıda PreparedStatement.setBinaryStream() yöntemini kullanarak, ama daha büyük bir görüntü dosyası ile herhangi bir şans sahip değilim

.

Yanlış bir şey yapıyorum? JDBC ile bu mümkün mü? DBA'yı rahatsız etmem gerekecek mi? Yardım ettiğin için teşekkür ederim.

DÜZENLEME: Sorun çözüldü. Ben çalışan bir örneğine bu kodu güncelledik:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.OutputStream; 
import java.sql.Blob; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 


public class WriteBlobDriver { 
    public static void main(String[] args) { 
     Connection con = null; 
     try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      con = DriverManager.getConnection(
        "blahblah", 
        "blahblah", 
        "blahblah"); 
      con.setAutoCommit(false); 
      Statement statement = con.createStatement(); 
      //statement.executeUpdate("UPDATE BATCH_GC_JOBS SET INPUT_BATCH_FILE = EMPTY_BLOB() WHERE JOB_ID = 'a'"); 

      //Get blob and associated output stream 
      ResultSet resultSet = statement.executeQuery("SELECT INPUT_BATCH_FILE FROM BATCH_GC_JOBS WHERE JOB_ID = 'a' FOR UPDATE"); 
      resultSet.next(); 
      Blob blob = resultSet.getBlob(1); 
      OutputStream outputStream = ((oracle.sql.BLOB)blob).getBinaryOutputStream(); 

      // Buffer to hold chunks of data to being written to the Blob. 
      byte[] buffer = new byte[10* 1024]; 
      int nread = 0; 

      //Write file to output stream 
      File file = new File("C:\\TEMP\\Javanese_cat.jpg"); 
      FileInputStream fileInputStream = new FileInputStream(file); 
      while ((nread = fileInputStream.read(buffer)) != -1) { 
       outputStream.write(buffer, 0, nread); 
      } 

      //Cleanup 
      fileInputStream.close(); 
      outputStream.close(); 
      statement.close(); 
      con.commit(); 
      con.close();    
      System.out.println("done!"); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

cevap

3

Ben güncellemek ya da (veri> 4k için) tek bir adımda JDBC ile BLOB/CLOB ekleyebileceğiniz sanmıyorum.

  1. SQL fonksiyonu güncelleme için empty_clob()
  2. Seç Are you
  3. sonra çıktıyı almak ResultSet.getBlob() ile java LOB olsun ekledikten LOB ile boş bir LOB ekleyin: this example from Oracle itibaren, yapmanız gerekenler görünüyor blob.setBinaryStream ile akarsu
  4. İşiniz bittiğinde çıkış akışı kapatmak bu çıktı akımına
  5. yazma (oracle.sql.BLOB.getBinaryOutputStream() kullanımdan kaldırıldı beri)

Sen Pl/SQL benzer bir şey (buna yazma, sonra UPDATE bir LOB SEÇ) yapardı.

+0

Vincent, resmi Oracle belgelerine bağlayan senin iyi düşünülmüş yanıt için teşekkürler. Ne yazık ki, örneklerini takip etmeye çalıştıktan sonra UPGATE FORMATI sorgusu yayınlanır yayınlanmaz ORA-01002 hatalarını almaya başladım. – Phil

+0

@Phil: ORA-01002, BLOB ile ilgili görünmüyor. İlk önce otomatik görüşmeyi devre dışı bıraktın mı? (bunun çalışması için bir işleme ihtiyacınız olacak => autocommit'i devre dışı bırak) –

+0

Teşekkürler, işe yaradı! – Phil

1

Sadece getBinaryOutputStream kullanımdan kaldırıldı hatırlıyorum. Bunun yerine oracle.sql.BLOB kullanıyorsanız, setBinaryStream kullanmalısınız.