# Insert Oracle BLOB



## Dan (Gast) (22. Okt 2007)

Hallo und guten Tag,

seit einiger Zeit versuche ich die Blob-Spalte einer Oracle-Tabelle via JDBC zu füllen. Leider ohne erfolg. Basis ist ein InputStream.
Problem ist, dass der InputStream von setBlob() nicht angenommen wird.


```
DROP TABLE TAB;
CREATE TABLE TAB(
  ID NUMBER(9) NOT NULL,
  DATA BLOB,
);
```

Ich arbeite mit PreparedStatements

```
StingBuffer sql = new StringBuffer();
sql = new StringBuffer();
sql.append(" UPDATE ");
	sql.append(" webuser.kwe_user ");
sql.append(" SET ");
	sql.append("data = ?");//TODO: Input!
sql.append(" WHERE ");
	sql.append("id= ? ");

PreparedStatement pStmt = ....getConnection().prepareStatement(sql.toString())
pStmt.setInt(2,1);
pStmt.[color=blue]setBlob[/color](1,inputStream);//InputStream ist vorhanden
pStmt.executeUpdate();
```

Fehlermeldung ist folgende:

```
java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBlob(ILjava/io/InputStream;)V
	at init.project.auskunft.database.DBUser.updateBLOB(DBUser.java:303)
```

Ein weiterer Weg war es, erst das Blob-Objekt (EMPTY_BLOB()) via SELECT zu holen, zu Bearbeiten und wieder einzuschreiben, aber wie kann ich ein java.sql.Blob-Objekt beareiten?

Vielen Dank für eure Weiterhilfe..
..Dan


----------



## abollm (22. Okt 2007)

Sieht auch ziemlich nach Murks aus, was du da produziert hast. ;-)

Versuch es mal wie folgt, dann klappt das auch:

```
package orablob;

import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;
/*
 * Created on 22.10.2007
 *
 * History: abollm Version 1.0 - 22.10.2007
 * 
 * Purpose: 1. DB-Connect (Thin) mit Oracle-DB herstellen,
 *          2. Tab. loeschen, 
 *          3. Insert für Blob absetzen und
 *          4. InputStream an Blob hängen.
 * 
 * TODO :
 * 
 */
public class OraBlobInsert {

	public static void main(String args[]) throws SQLException,
			FileNotFoundException, IOException {
        String tableName = "TAB";
        String col1 = "ID";
        String col2 = "DATA";
		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
		Connection conn = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:deineDB", "scott", "tiger");
		conn.setAutoCommit(false);
		Statement stmt = conn.createStatement();
		stmt.execute("delete from "+tableName);
		System.out.println("deleted from "+tableName);

		stmt.execute("insert into "+tableName+"("+col1+","+col2+") values (1,empty_blob())");
		System.out.println( "inserted into "+ tableName);
		conn.commit();
		System.out.println("INSERT committed");
		ResultSet rset = stmt
				.executeQuery("SELECT "+col2+" FROM "+ tableName +" where "+ col1 +" = 1 FOR UPDATE");
		System.out.println("Executed Query");

		if (rset.next()) {
			System.out.println("Fetched row ");

			BLOB l_mapBLOB = ((OracleResultSet) rset).getBLOB(1);

			File binaryFile = new File("e:\\Test.xls");
			FileInputStream instream = new FileInputStream(binaryFile);

			int chunk = 32000;

			System.out.println("Chunk = " + chunk);

			byte[] l_buffer = new byte[chunk];

			int l_nread = 0;

			OracleCallableStatement cstmt = (OracleCallableStatement) conn
					.prepareCall("begin dbms_lob.writeappend( :1, :2, :3 ); end;");

			cstmt.registerOutParameter(1, OracleTypes.BLOB);
			while ((l_nread = instream.read(l_buffer)) != -1) {
				cstmt.setBLOB(1, l_mapBLOB);
				cstmt.setInt(2, l_nread);
				cstmt.setBytes(3, l_buffer);

				cstmt.executeUpdate();

				l_mapBLOB = cstmt.getBLOB(1);
			}
			instream.close();

			conn.commit();
			rset.close();
			stmt.close();
			System.out.println("Appended blob and closed connection ");
		}
	}
}
```


----------

