Bom dia pessoal …
Tenho o seguinte codigo:
[code]import java.io.;
import java.sql.;
import oracle.jdbc.driver.;
import oracle.xml.sql.;
import oracle.sql.*;
public class InsertEmps {
/* YOU'LL have to change these connection properties */
static String conStr = "jdbc:oracle:thin:@190.1.1.5:1521:DESEN";
public static void main(String args[])
throws SQLException, FileNotFoundException, IOException {
args = new String [3];
args[0] = "cristiano";
args[1] = "cristiano";
args[2] = "C:\teste_java_xml\teste.xml";
if (args.length != 3) {
System.out.println("\nUsage:\n java InsertEmps <username> <password> <filename>\n");
System.exit(0);
}
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(conStr, args[0], args[1]);
conn.setAutoCommit(false);
String sql =
"begin insert into tmp_clob(theclob) " +
"values (empty_clob()) return theclob,id into ?,?; end;";
OracleCallableStatement ocs = (OracleCallableStatement)conn.prepareCall(sql);
ocs.registerOutParameter(1, OracleTypes.CLOB);
ocs.registerOutParameter(2, OracleTypes.NUMBER);
ocs.executeUpdate();
oracle.sql.NUMBER clobId = ocs.getNUMBER(2);
InputStream is = new FileInputStream(args[2]);
OutputStream os = (ocs.getCLOB(1)).getAsciiOutputStream();
byte[] buf = new byte[1024];
int length;
while ((length = is.read(buf, 0, 1024)) != -1) {
os.write(buf, 0, length);
}
is.close();
os.close();
ocs.close();
OracleCallableStatement ocs2 =
(OracleCallableStatement)conn.prepareCall("begin ? := insert_xml_emps(?, ?); end;");
ocs2.registerOutParameter(1, OracleTypes.NUMBER);
ocs2.setString(2,"EMP1");
ocs2.setNUMBER(3, clobId);
try {
ocs2.execute();
System.out.println("Inserted " + (ocs2.getNUMBER(1)).longValue() + " records.");
} catch (Exception e) {
e.printStackTrace();
}
ocs2.close();
conn.commit();
conn.close();
}
}
[/code]
Quando tento executar da seguinte mensagem é apresentada:
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at InsertEmps.main(InsertEmps.java:40)
Alguem pode me ajudar ?
Grato.
Tenta verificar esse meu código e adaptar a sua realidade.
Sendo que aqui usei uma mesclagem de Hibernate + JPA + JDBC, mas considere apenas esses métodos como métodos para inserir ou obter dados BLOB de um banco. Como sua base é Oracle algumas mudanças podem ser necessárias.
Caso precise de JPA puro eu desenvolvi um exemplo que persiste e obtêm instâncias com blob do banco.
/**
* TODO
* @param pStream
*/
public void setArquivo(InputStream pStream) {
}
public void setArquivo(String pCaminho) {
{
EntityManager lEm = JPAUtil.getEntityManager();
FileInputStream lFileStream = null;
try {
Session lSession = (Session) lEm.getDelegate();
SessionFactoryImplementor lSessionImp = (SessionFactoryImplementor) lSession.getSessionFactory();
ConnectionProvider lProvider = (ConnectionProvider) lSessionImp.getConnectionProvider();
Connection lConn = lProvider.getConnection();
if (lConn != null) {
File lFile = new File(pCaminho);
lFileStream = new FileInputStream(lFile);
byte[] lArquivo = new byte[(int)lFile.length()];
lFileStream.read(lArquivo);
PreparedStatement lPstm =
lConn.prepareStatement("UPDATE DCU_DOCUMENTO SET DCU_ARQUIVO = ?" +
" WHERE DCU_ID = ?");
lPstm.setBytes(1, lArquivo);
lPstm.setLong(2, getId());
lPstm.executeUpdate();
System.out.println("Inseriu arquivo com sucesso!!!");
}
} catch (IOException ex) {
Logger.getLogger(Documento.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Documento.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public byte[] getArquivo() {
try {
EntityManager lEm = JPAUtil.getEntityManager();
Session lSession = (Session) lEm.getDelegate();
SessionFactoryImplementor lSessionImp = (SessionFactoryImplementor) lSession.getSessionFactory();
ConnectionProvider lProvider = (ConnectionProvider) lSessionImp.getConnectionProvider();
Connection lConn = lProvider.getConnection();
if (lConn != null) {
Statement lStm = lConn.createStatement();
ResultSet lRs = lStm.
executeQuery("SELECT DCU_ARQUIVO FROM " +
"DCU_DOCUMENTO WHERE DCU_ID = " + getId());
if (lRs.next()) {
byte[] lArquivo = lRs.getBytes(1);
return lArquivo;
}
}
return null;
} catch (SQLException ex) {
Logger.getLogger(Documento.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
Temos um método aqui que usamos p/ pegar Clobs e colocar em Strings(quando clobs são menores que 65700 caracteres):
[code] protected static String getStringFromClob(ResultSet rs, int campo) throws SQLException, IOException
{
Reader reader = null;
Writer writer = null;
int i = 0;
try
{
reader = new InputStreamReader(rs.getClob(campo).getAsciiStream());
writer = new StringWriter();
while ((i = reader.read()) != -1)
writer.write(i);
return writer.toString();
}
finally
{
if (reader != null)
{
reader.close();
reader = null;
}
if (writer != null)
{
writer.flush();
writer.close();
writer = null;
}
}
}[/code]
Daí é só mudar o StringWriter para outro writer. Quem sabe usar um BufferedReader também.