How To: Oracle Java Stored Procs get and set BLOBs to disk
Date: 8 May 2003 23:22:25 -0700
Message-ID: <d5485443.0305082222.528a8c38_at_posting.google.com>
Isn't it wonderful: so many ask for solutions, but after heaps of suggestions the final solution/s is/are never posted..... To make up the deficiency....
Create Java Stored Proc:
import java.io.*;
import java.sql.*;
public class OraBlobSP {
public static oracle.sql.BLOB getBlob( String id) { String sqlNewRow = "INSERT INTO VILARGEOBJECTS (LOB_ID, BINOBJ, TIME) VALUES (?,EMPTY_BLOB(),?)"; String sqlGetBlob = "SELECT BINOBJ FROM VILARGEOBJECTS WHERE LOB_ID = ? FOR UPDATE"; boolean dbAutoCommitStatus = false; Connection cxn; PreparedStatement ps; oracle.sql.BLOB dbBlob = null; try { cxn = DriverManager.getConnection("jdbc:default:connection:"); dbAutoCommitStatus = cxn.getAutoCommit(); cxn.setAutoCommit(false);?";
//make new row
ps = cxn.prepareStatement(sqlNewRow); ps.setString(1,id); ps.setString(2,id); ps.executeUpdate(); ps = cxn.prepareStatement(sqlGetBlob); ps.setString(1,id); ResultSet rs = ps.executeQuery(); rs.next();
//Oracle JDBC uses the method putBytes(int,byte[])
dbBlob = (oracle.sql.BLOB)rs.getBlob(1); cxn.setAutoCommit(dbAutoCommitStatus); } catch (SQLException sqle) { sqle.printStackTrace(); throw new RuntimeException(sqle.getMessage()); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex.getMessage()); } return dbBlob; }// end savelob public static String updateBlob(oracle.sql.BLOB incomingBlob, String id){ String sqlLockRow = "SELECT BINOBJ FROM VILARGEOBJECTS WHERE LOB_ID = ? FOR UPDATE", sqlSetBlob = "UPDATE VILARGEOBJECTS SET BINOBJ = ? WHERE LOB_ID =
Connection cxn; PreparedStatement ps; boolean dbAutoCommitStatus = false; String retVal = "FAILURE"; try { cxn = DriverManager.getConnection("jdbc:default:connection:"); dbAutoCommitStatus = cxn.getAutoCommit(); cxn.setAutoCommit(false); ps = cxn.prepareStatement(sqlLockRow); ps.setString(1,id); ResultSet rs = ps.executeQuery(); rs.next();
//Use oracle.sql.BLOB because the java.sql.Blob interface
lacks setBytes()
//JDBC3 java.sql.Blob adds the method setBytes(int,byte[])
//Oracle JDBC uses the method putBytes(int,byte[])
oracle.sql.BLOB dbBlob = (oracle.sql.BLOB)rs.getBlob(1);
//update blob
ps = cxn.prepareStatement(sqlSetBlob); ps.setString(2,id);
//dbBlob.putBytes(1,fileBytes);
ps.setBlob(1,incomingBlob); retVal = "SUCCESS"; cxn.setAutoCommit(dbAutoCommitStatus); } catch (SQLException sqle) { sqle.printStackTrace(); throw new RuntimeException(sqle.getMessage()); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex.getMessage()); } return retVal; }// end updateBlob
}
Create call spec:
SQL> create or replace package orablobsp as 2 function getblob(x varchar2) return blob; 3 function updateblob(x blob, y varchar2) return varchar2; 4 end;
5 /
Package created.
SQL> create or replace package body orablobsp as
2 function getblob(x varchar2 )return blob
3 as language java
4 name 'OraBlobSP.getBlob(java.lang.String) return
oracle.sql.BLOB';
5 function updateblob( x blob, y varchar2) return varchar2
6 as language java
7 name 'OraBlobSP.updateBlob(oracle.sql.BLOB, java.lang.String)
return java.lang.String';
end orablobsp;
Create caller:
import javax.ejb.EJBException;
import java.util.Calendar; import java.util.TimeZone; import java.text.SimpleDateFormat; import java.util.HashMap; import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.sql.SQLException; import java.util.Hashtable; import java.io.InputStream; import java.io.FileInputStream; import java.io.File; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.ClassNotFoundException;
import oracle.jdbc.driver.OracleConnection;
import java.sql.Types;
import javax.sql.DataSource;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.CallableStatement; import java.sql.Statement;
//import java.sql.ResultSet;
public class OraLobSPCaller {
public static final SimpleDateFormat ISO8601_TIMESTAMP_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); public static void main(String [] args ){ Calendar cal = Calendar.getInstance(TimeZone.getDefault()); String insertTime = (String)
ISO8601_TIMESTAMP_FORMATTER.format(cal.getTime());
String url = "jdbc:oracle:thin:_at_panther:1524:shapedev"; String username = "melroy"; String password = "password"; CallableStatement cstmt = null, cstmt1 = null; Connection conn = null; FileInputStream stream = null; try { DriverManager.registerDriver( new
oracle.jdbc.driver.OracleDriver());
File binaryFile = new File("c:/temp" + System.getProperty("file.separator") + args[0]);
System.out.println("Binary file size: " + binaryFile.length()); stream = new FileInputStream(binaryFile); System.out.println("Got InputStream from File:" + args[0]); conn = DriverManager.getConnection(url, username, password); conn.setAutoCommit(false); System.out.println("Got Connection "); cstmt = conn.prepareCall("{? = call orablobsp.getblob(?)}"); System.out.println("Creating CallableStatement "); cstmt.registerOutParameter(1, Types.BLOB); cstmt.setString(2, insertTime); cstmt.executeQuery(); System.out.println("Executed GetBLOB Query"); oracle.sql.BLOB theBlob = (oracle.sql.BLOB)cstmt.getBlob(1); System.out.println("Got Blob Back"); cstmt.close(); System.out.println("LOB_ID: " + insertTime); int available = 0; // While more bytes in stream..... System.out.println("Starting loop: Stream size: " +stream.available());
////////////////////////////////////////////// int bufferSize = theBlob.getBufferSize(); // int blobLength = new Long(theBlob.length()).intValue(); int blobLength = 0; // sbRetVal.append(" Blob Length Before Append: " + blobLength); byte[] ioBuffer= new byte[bufferSize]; int bytesRead = -1; int cTotal = 0; // sbRetVal.append(" Starting Append...."); while((bytesRead = stream.read(ioBuffer, 0, ioBuffer.length)) != -1){ if(bytesRead < ioBuffer.length) { byte[] dynBytes = new byte[bytesRead]; for(int i = 0 ; i<bytesRead; i++) { dynBytes[i] = ioBuffer[i]; } theBlob.putBytes(blobLength+1, dynBytes); cTotal = cTotal + bytesRead; System.out.println("Breaking out of last loop set"); break; } theBlob.putBytes(blobLength+1, ioBuffer); cTotal = cTotal + bytesRead; blobLength = blobLength + bytesRead; System.out.println(" In Append -Blob Length: " + blobLength); } System.out.println(" TotalSize of blob appended: " + cTotal); stream.close(); cstmt1 = conn.prepareCall("{? = call orablobsp.updateblob(?,?)}"); System.out.println("Creating CallableStatement "); cstmt1.registerOutParameter(1, Types.VARCHAR); cstmt1.setBlob(2, theBlob); cstmt1.setString(3,insertTime); cstmt1.executeQuery(); System.out.println("Executed GetBLOB Query"); String retVal = cstmt1.getString(1); cstmt.close(); System.out.println("Return VALUE: " + retVal ); System.out.println("LOB_ID: " + insertTime); conn.setAutoCommit(true); } catch (SQLException sqle ) { sqle.printStackTrace(); System.out.println("ERROR MESSAGE: " + sqle.getMessage()); } catch(IOException ioe) { ioe.printStackTrace(); System.out.println("ERROR MESSAGE: " + ioe.getMessage()); } catch (Exception ex) { ex.printStackTrace(); }//end try-catch finally { try { cstmt.close(); conn.close(); stream.close(); } catch (IOException ex) { ex.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); System.out.println("ERROR MESSAGE: " + e.getMessage()); }// end try }// end finally }//end main
}//end dbcall
Create a getter:
import javax.ejb.EJBException;
import java.util.Calendar; import java.util.TimeZone; import java.text.SimpleDateFormat; import java.util.HashMap; import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.sql.SQLException; import java.util.Hashtable; import java.io.InputStream; import java.io.FileInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.ClassNotFoundException;
import oracle.jdbc.driver.OracleConnection;
import oracle.sql.BLOB;
import java.sql.Blob;
import java.sql.Types;
import javax.sql.DataSource;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.CallableStatement; import java.sql.Statement;
//import java.sql.ResultSet;
public class dbgetplsql {
public static final SimpleDateFormat ISO8601_TIMESTAMP_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); public static void main(String [] args ){ Calendar cal = Calendar.getInstance(TimeZone.getDefault()); String insertTime = (String)
ISO8601_TIMESTAMP_FORMATTER.format(cal.getTime());
String url = "jdbc:oracle:thin:_at_panther:1524:shapedev"; String username = "melroy"; String password = "password"; CallableStatement cstmt = null; Connection conn = null; InputStream blobStream = null; FileOutputStream fileOutStream = null; try { DriverManager.registerDriver( new
oracle.jdbc.driver.OracleDriver());
File binaryFile = new File("c:/temp" + System.getProperty("file.separator") + args[1]);
conn = DriverManager.getConnection(url, username, password);
conn.setAutoCommit(false);
System.out.println("Got Connection ");
cstmt = conn.prepareCall("{? = call LOBget(?)}"); System.out.println("Creating CallableStatement "); cstmt.registerOutParameter(1, Types.BLOB); cstmt.setString(2, args[0]); cstmt.executeQuery(); System.out.println("Executed CallableStatement"); BLOB inBlob = (oracle.sql.BLOB)cstmt.getBlob(1); //Blob inBlob = cstmt.getBlob(1); System.out.println("got BLOB from cstmt"); // Open a stream to read the Blob data blobStream = inBlob.getBinaryStream(); System.out.println("got BLOBStream from blob");
// Open a file stream to save the Blob data
fileOutStream = new FileOutputStream(binaryFile);
// Read from the Blob data input stream, and write to the
file output
// stream
byte[] buffer = new byte[inBlob.getBufferSize()]; // buffer holding bytes to be transferred
//byte[] buffer = new byte[24]; // buffer holding bytes to be
transferred int nbytes = 0; // Number of bytes read while( (nbytes = blobStream.read(buffer)) != -1 ){ // Read from Blob stream fileOutStream.write(buffer, 0, nbytes); // Write to file stream fileOutStream.flush(); System.out.println("Bytes: " + nbytes); }
// Flush and close the streams
fileOutStream.close(); blobStream.close(); } /* catch (SQLException sqle ) { sqle.printStackTrace(); System.out.println("ERROR MESSAGE: " + sqle.getMessage()); } */ /*catch(ClassNotFoundException cnfe) { cnfe.printStackTrace(); }*/ catch(IOException ioe) { ioe.printStackTrace(); System.out.println("ERROR MESSAGE: " + ioe.getMessage()); } catch (Exception ex) { ex.printStackTrace(); }//end try-catch finally { try { fileOutStream.flush(); fileOutStream.close(); blobStream.close(); } catch (IOException ex) { ex.printStackTrace(); } /* catch (SQLException e) { e.printStackTrace(); System.out.println("ERROR MESSAGE: " + e.getMessage()); }// end try */ }// end finally }//end main
}//end dbcall
All the best. Received on Fri May 09 2003 - 08:22:25 CEST