Problemas p inserir em um campo Clob no Oracle 10g

4 respostas
R

Estou com problemas p inserir em um campo Clob no Oracle 10g. Antes tinhamos a versao 9i e o codigo usando o oracle.sql.Clob funcionava legal, porem migramos p 10 g e o codigo parou de funcionar. Mudamos o tipo de Clob p StringReader e voltou a funcionar, mas para textos muito extensos dá o seguinte erro: "ORA-01460: conversão não-implementada ou não-resolvível solicitada at oracle.jdbc.dbaccess.DBError… "

Pesquisei td na Web, em geral tem como capturar o campo clob e converter p string, mas não encontrei nda q funcionasse para INSERT…Alguem já passou por esse problema?

Segue o codigo:

public boolean save() throws SQLException{
        	Connection conn = DbManager.conectarOracle();
		String query = "";	               
                StringReader html = new StringReader(this.htmlObjeto);                            
                                                
		try{
        	if (this.idObjetoRegistrado == 0){
				query = "INSERT INTO dbsm.ufam_objetoregistrado " +
						"(idobjetoregistrado, TipoObjeto_idTipoObjeto, idAluno,"+
                                                "htmlObjeto, idRastreamento, horaAlteracao, dataAlteracao, codOperador) "+
 						"VALUES (?,?,?,?,?, sysdate, sysdate,?)";                                
				System.out.println("*Query*");
				System.out.println(query);
				cSt = conn.prepareStatement(query);                              
                                
				cSt.setLong(1,this.retornaNextIdoObjetoRegistrado());
				cSt.setInt(2,this.tipoObjeto_idTipoObjeto);
				cSt.setString(3,this.idAluno);
				cSt.setCharacterStream(4, html, this.htmlObjeto.length());
				cSt.setString(5,this.idRastreamento);
				cSt.setInt(6,this.codOperador);
                                cSt.executeUpdate();
				//DbManager.close(cSt);
			}	
			else{
		    	st =  conn.createStatement();
				query = "update dbsm.ufam_objetoregistrado SET idObjetoRegistrado = '"+this.idObjetoRegistrado+"', TipoObjeto_idTipoObjeto = '"+this.tipoObjeto_idTipoObjeto+"', idAluno = '"+this.idAluno+"', htmlObjeto = '"+this.htmlObjeto+"', idRastreamento = '"+this.idRastreamento+"', horaAlteracao = '"+this.horaAlteracao+"', dataAlteracao = '"+this.dataAlteracao+"', codOperador = '"+this.codOperador+"'WHERE idObjetoRegistrado = '"+this.idObjetoRegistrado+"'";
				st.executeUpdate(query);
				//DbManager.close(st);
			}	
			//System.out.println(query);	
			return (true);
		}catch(SQLException ex){
			ex.printStackTrace();
		}
		finally {
     			st.close();
			cSt.close();
   			if (conn != null) {
			      try {
			         conn.close(); 
			      } catch (SQLException e) {}
			      conn = null;
			}
    		}  
		return(false);
	}

4 Respostas

P

tenta isso

http://www.hibernate.org/56.html

abraços.

L

isso acaba com seus problemas referente a arquivos…

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html

a ultima versao do driver arruma isso, porem, contudo… rs
esse driver tem um problema… o Timestamp para de trazer as horas certas… traz 0:00:00!
não sei se vc ocupa timestemp ou cria os campos comos Date…
Mas referente a gravação de arquivos resolve teu problema

[]s

R

Obrigado pela dica, mas consegui resolver não. Dá um erro ORA-01460. O estranho é q alguns objetos menores ele inseri, mas p objetos maiores naum. Por exemplo: p string de length ate 4000é possivel inserir sem erro, porem acima disso dá erro. O setCharacterStream possui um limite?

L

Sim… aqui acontecia o mesmo erro… arquivos ate 4k ele nao dava problema… maiores davam…
mas atualizando o drive resolveu… tenta pegar alguma versao mais nova tambem…
o problema que o timestamp dai bixou…

segue um exemplo de como a gente usou pra inserir no banco… nao sei se vai funcionar… mas testa ai :smiley:

String select = " SELECT "+ attributeName +" FROM "+ tableName +" WHERE "+ whereAttrib +" = ? FOR UPDATE ";
        
        String update = " UPDATE "+ tableName +" SET "+ attributeName +" = empty_blob() WHERE "+ whereAttrib +" = ? ";
        ps = dbTransaction.createPreparedStatement(update, DBTransaction.DEFAULT);
        ps.setBigDecimal(1,  idRegistro);
        ps.executeUpdate();
        ps.clearParameters();       
        
        ps = dbTransaction.createPreparedStatement(select, DBTransaction.DEFAULT);
        boolean autocommit = ps.getConnection().getAutoCommit(); 
        
        ps.getConnection().setAutoCommit(false);
          
        ps.setBigDecimal(1, idRegistro);
        rs =  ps.executeQuery();
        rs.next();
        
        // copia arquivo para campo blob
        File byteFile = new File(fileName);
        Blob blob = rs.getBlob(attributeName);
        byte[] bbuf = new byte[1024];
        InputStream bin = new FileInputStream(byteFile);
        OutputStream  bout = ((BLOB) blob).getBinaryOutputStream(); // específico driver oracle
        int bytesRead = 0;
        
        while ((bytesRead = bin.read(bbuf)) != -1) {
            bout.write(bbuf, 0, bytesRead);
        }
        
        bin.close();
        bout.close();
        ps.getConnection().setAutoCommit(autocommit);

qualquer coisa berra :smiley:
[]s

Criado 1 de setembro de 2008
Ultima resposta 3 de set. de 2008
Respostas 4
Participantes 3