Newsgroup: it.comp.java
Titolo: problema con CLOB

ciao a tutti.
dunque il mio problema si verifica in fase di inserimento di un
oggetto clob in
oracle. al momento della terminazione della transazione Oracle lancia
la seguente eccezione:
Io allego il pezzo di codice incriminato:
        /**
	 * Permit to insert a record in its table
	 * @param con the connection to be passed
	 * @throws SQLException if insert operation don't successful 
	 */			
	public void insert(Connection con) throws Exception {
	super.insert(con);
		try {
			System.out.println("rows affected: " + insertCLOB(con));
			System.out.println("CLOB " + selectCLOB(con));		
		}
		catch(SQLException sqle){
			c_log4j.log(Priority.ERROR, "Exception sql", sqle);
			throw sqle;
		}
	}
	private int insertCLOB(Connection con)throws SQLException{
		String ciao = "a";
		PreparedStatement preStmt = null;
		StringBuffer query = new StringBuffer("INSERT INTO ");
		query.append(TN_RICHTEXT_ELEMENT).append(" (");
		query.append(CN_RICHTEXT_ID).append(", ");
		query.append(CN_RICHTEXT).append(") VALUES (");
		query.append("?").append(", ");
		query.append("EMPTY_CLOB())");
		preStmt = con.prepareStatement(query.toString());
		preStmt.setString(1, getId());
		//preStmt.setCharacterStream(2, sr, ciao.length());
		return preStmt.executeUpdate();
	}
 
	private oracle.sql.CLOB selectCLOB(Connection con)throws
SQLException,java.io.IOException{
 
		PreparedStatement preStmt = null;
		oracle.sql.CLOB clob = null;
		StringBuffer query = new StringBuffer("SELECT RICHTEXT FROM
RICHTEXTELEMENT ");
		String str = "ciao";
		query.append("where contentelementid = ?");
		preStmt = con.prepareStatement(query.toString());
		preStmt.setString(1, getId());
		ResultSet rs = preStmt.executeQuery();
		while (rs.next()){
			java.sql.Clob clob1	= rs.getClob("RICHTEXT");
			clob = (CLOB)clob1;
			java.io.Writer wr = clob.getCharacterOutputStream();
			wr.write(str.toCharArray()); 
			wr.flush();
			wr.close(); 
		}
		rs.close();
		return clob;	
	}
Importante sapere che uso Oracle 8.1.7 come thin e jdk 1.3.1.
Grazie per l'eventuale aiuto.

NN so se ti può essere d'aiuto, io sto facendo un'applicazione che 
inserisce dei BLOB (più o meno penso che sia la stessa cosa)
io uso oracle 8.1.6
jdk 1.4
ti allego parte del codice così magari ti estrapoli ciò che ti serve.
ciao alessio
public void inserisci(String lista[], String dirIn, String errorLevel) {
		Connection DBconnection;
		PreparedStatement ps;
		Blob b;
		OracleResultSet rs = null;
		int i=0;
		for( i=0 ; i < java.lang.reflect.Array.getLength(lista) ; i++){
			String codice = lista[i].substring(lista[i].indexOf("-")+1 , 
lista[i].lastIndexOf("-"));
			//Connessione al DB oracle, se non si riesce a connettere si 
interrompe il programma
 
			//Specifico i driver di connessione al DB
			try
			{
				Class.forName ("oracle.jdbc.driver.OracleDriver");
			}
			catch (ClassNotFoundException e)
			{
				Ctm ctm = new Ctm();
				ctm.sendCtmMessage("DBclassNotFound","Classi per accesso al DB non 
trovate: " + e.getMessage());
				System.out.println("Programma terminato vedi file: "+ 
log.getLogFileName());
				e.printStackTrace();
				log.write("Classi per accesso al DB non trovate: " + e.getMessage());
				System.exit(1);
			}
 
			//Creo una nuova connessione al DB dando l'indirizzo di rete, login 
e pwd	
			try
			{
				DBconnection = DriverManager.getConnection ("jdbc:oracle:thin:" + 
this.Username + "/" + this.Password + "@" + this.Host + ":1521:ra2k");
				DBconnection.setAutoCommit( false );
			}
			catch (SQLException e)
			{
				Ctm ctm = new Ctm();
				ctm.sendCtmMessage("sql","Problema nella connessione al DB 
(Username,Password o Host probabilmente errati o DB non presente): " + 
e.getMessage());
				DBconnection = null;
				System.out.println("Programma terminato vedi file: "+ 
log.getLogFileName());
				e.printStackTrace();
				log.write("Problema nella connessione al DB (Username,Password o 
Host probabilmente errati o DB non presente): " + e.getMessage());
				System.exit(1);
			}
 
			try
			{
				// Prepare the blob column.
				ps = DBconnection.prepareStatement(
				"UPDATE signeddata SET td_sdata = EMPTY_BLOB() WHERE code = ?" );
				ps.setString( 1, codice );
				ps.execute();
				ps.close();
				// Select the blob column for update.
				// An OracleResultSet will be used.
				ps = DBconnection.prepareStatement("SELECT td_sdata FROM signeddata 
WHERE code = ? FOR UPDATE" );
				ps.setString( 1, codice );
				rs = (OracleResultSet) ps.executeQuery();
				// Throw an exception if the blob reference was not retrieved.
				if( ! rs.next() )
				throw new SQLException( "Unable to retrieve BLOB reference.");
				// The type returned is the BLOB type defined by Oracle.
				b = (Blob) rs.getBlob( 1 );
				OutputStream os = ((oracle.sql.BLOB) b ).getBinaryOutputStream();
 
			File blobFile = new File(dirIn + lista[i]);
			Base64.encode(blobFile);
			InputStream fileStream = new FileInputStream(blobFile);
			byte[] buffer = new byte[10* 1024];
			int nread = 0;
			while( (nread= fileStream.read(buffer)) != -1 ){
			os.write(buffer, 0, nread);
			}
			os.close();
			fileStream.close();
 
			if (errorLevel.equals("full"))
			{
				log.write(" INSERITO file : " + dirIn + lista[i] + "\n");
			}
 
			// Commit the changes.
			DBconnection.commit();
			rs.close();
			ps.close();
			DBconnection.rollback();
			DBconnection.close();
			blobFile.delete();
			}
			catch (SQLException e)
			{
				Ctm ctm = new Ctm();
				ctm.sendCtmMessage("sql","Errore SQL, controllare i nomi di tabelle 
e campi: " + e.getMessage());
				b = null;
				System.out.println("Programma terminato vedi file: "+ 
log.getLogFileName());
				e.printStackTrace();
				log.write("Errore SQL, controllare i nomi di tabelle e campi: " + 
e.getMessage());
				System.exit(1);
			}
			catch (FileNotFoundException e)
			{
				Ctm ctm = new Ctm();
				ctm.sendCtmMessage("io-blob","Errore nella gestione del file BLOB, 
BLOB inesistente o non valido: " + e.getMessage());
				System.out.println("Programma terminato vedi file: "+ 
log.getLogFileName());
				e.printStackTrace();
				log.write("File "+ dirIn + lista[i] + " non trovato" + e.getMessage());
				System.exit(1);
			}
			catch (IOException e)
			{
				Ctm ctm = new Ctm();
				ctm.sendCtmMessage("io-blob","Errore negli stream di input o output, 
controllare che il BLOB o il file esista" + e.getMessage());
				b = null;
				System.out.println("Programma terminato vedi file: "+ 
log.getLogFileName());
				e.printStackTrace();
				log.write("Errore negli stream di input o output, controllare che il 
BLOB o il file esista" + e.getMessage());
				System.exit(1);
			}
		}
 
		if (errorLevel.equals("full"))
			{
				log.write(" Trovati in TOT " + i + " record firmati.\n");
			}
 
	}