Oracle: 27kB werden nicht in Blob gespeichert!?

Hallo, hab schon wieder ein kleines Problem mit den lieben Blobs…

Ich speichere mit folgendem Code Dateien in der DB (Oracle 9.2):

 System.out.println("methodListXml: " + methodListXml.length);
 System.out.println("wsdlEdit: " + wsdlEdit.length);
 try {
 logger.info("UPDATE TBLSERVICE SET "
 + "METHODLISTXML = ? WHERE (SERVICENAME = '" + serviceName + "')");
 PreparedStatement pstmt = dbConnection.connection.prepareStatement("UPDATE TBLSERVICE SET "
 + "METHODLISTXML = ? WHERE (SERVICENAME = '" + serviceName + "')");
// pstmt.setBytes(1, methodListXml);
 pstmt.setBinaryStream( 1, baisMethodListXml, methodListXml.length ); 
 pstmt.executeUpdate();
 pstmt.close();
 } catch (BatchUpdateException e) {
 logger.error(message2 + e.getMessage());
 } catch (SQLException e) {
 logger.error(message1 + e.getMessage());
 }
 try {
 logger.info("UPDATE tblService SET "
 + "WSDL = ? WHERE (SERVICENAME = '" + serviceName + "')");
 PreparedStatement pstmt = dbConnection.connection.prepareStatement("UPDATE tblService SET "
 + "WSDL = ? WHERE (SERVICENAME = '" + serviceName + "')");
// pstmt.setBytes(1, wsdlEdit); 
 pstmt.setBinaryStream( 1, baisWsdl, wsdlEdit.length ); 
 pstmt.executeUpdate();
 pstmt.close();
 } catch (BatchUpdateException e) {
 logger.error(message2 + e.getMessage());
 } catch (SQLException e) {
 logger.error(message1 + e.getMessage());
 }

Die eine Datei (819 Bytes) wird problemlos gespeichert. Die andere (27 KBytes) leider nicht. Ich bekomme keinen Fehler, aber sie wird einfach nicht abgelegt.

Wenn ich mir mit dem DBVisualizer die Eigenschaften der Spalten meiner Tabelle anschaue, dann haben die BLOBS eine DATA_LENGTH von 4000 Bytes. Wie kommt das? Ist das mein Problem? Ich dachte BLOBs seien flexibel bis 4 GB, wovon ich noch ein wenig entfernt bin?
Habe die Tabelle einfach in SQLPlus mit CREATE TABLE … (Spaltenname BLOB, …) erzeugt. Muss ich da noch eine Größe mitgeben?

Muss ich verzweifeln, oder kann mir jemand helfen?

Hallo,

du musst die Maximallänge beim Erstellen der Tabelle angeben.

blobfeld blob(1M),

Gruß

Peter

Hallo,

du musst die Maximallänge beim Erstellen der Tabelle angeben.

blobfeld blob(1M),

–> Das wäre mir neu, woher hast du dass ? Du kannst es angeben, du musst es aber nicht.

Ich mach das so:

import java.sql.\*;
import java.io.\*;
import java.util.\*;
import oracle.jdbc.driver.\*;
import oracle.sql.\*;

public class dbInsertBlob {

 /\*\*
 \* @param args
 \*/
 public static void main(String[] args) {
 // TODO Auto-generated method stub
 System.out.println("Start"); 
 String dbURL = "jdbc:oracle:thin:@ IP :1521:SID ";//test
 String dbUser = "..";
 String dbPasswd = "...";
 String insertSQL = "insert into nic.TEST\_BLOB (TB\_ID,TB\_DATA) values (2,EMPTY\_BLOB())";
 String selectSQL = "select TB\_DATA from nic.TEST\_BLOB where TB\_ID=2 FOR UPDATE";
 String fName = "d:/tmp/bild1.jpg"; 


 System.out.println(InsertBlob(dbURL,dbUser,dbPasswd,insertSQL,selectSQL,fName));
 }

 public static String InsertBlob(String dbURL, String dbUser, String dbPasswd, String insertSQL, String selectSQL, String fName) {
 // TODO Auto-generated method stub
 Connection dbCon = null;
 OutputStream ostream =null;;
 Statement st = null;
 ResultSet rs = null;
 File infile;
 FileInputStream istream;
 String r=""; 
 try {
 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
 dbCon = DriverManager.getConnection(dbURL, dbUser, dbPasswd);
 dbCon.setAutoCommit(false);
// System.out.println("Connected");
 st = dbCon.createStatement();
 st.execute(insertSQL);
// System.out.println("insertSQL ausgeführt");
 rs = st.executeQuery(selectSQL);
 if (rs.next()) {
// System.out.println("selectSQL ausgeführt");
 BLOB blob = ((OracleResultSet) rs).getBLOB(1);
 infile = new File(fName);
// System.out.println(infile.length());
 istream = new FileInputStream(infile);
 ostream = blob.getBinaryOutputStream();
 byte[] buffer = new byte[1024];
 int length = 0;
 try {
 while ((length = istream.read(buffer)) != -1)
 ostream.write(buffer, 0, length);
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 istream.close();
 ostream.close();
 }
 dbCon.commit();
 dbCon.close();
 r="OK";
 //System.out.println("DisConnected");

 } catch (SQLException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (FileNotFoundException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 return r;


 }

}


blobfeld blob(1M),

Du kannst es
angeben, du musst es aber nicht.

Kann man das wirklich?

ich bekomme dann folgenden Fehler: „ORA-00907: Rechte Klammer fehlt“

Scheint also leider nicht die Lösung zu sein.

Andere Ideen?

Gruß Taste

Hallo,

sorry, ihr habt ja recht. Ich hatte da eine veraltete Syntax. Aber hier ist ein Link, wie es geht. Man muss einen lob-Storage angeben, wenn die Größe 4000 Byte überschreitet. In dem Link oist ein schönes Beispiel, das muss man dann nur noch abtippen:

http://www.dba-oracle.com/t_table_blob_lob_storage.htm

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]