CLOB aus einer Oracle DB in einen String einlesen und Ausgeben

ramzymamzy

Mitglied
Hallo,

wie im Titel erwähnt, möchte ich einen CLOB aus einer Oracle DB in einen String einlesen und diesen ausgeben! Kann jemand weiterhelfen?
Vielen Dank im vorraus
 
Hallo!

Versuchs mal so:

SQL> SHOW RELEASE;
release 902000300

C:\>java -version
java version "1.5.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode, sharing)

JDBC Treiber infos:
Manifest-Version: 1.0
Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Specification-Vendor: "Oracle Corporation" .
Implementation-Title: "ojdbc14_g.jar"
Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Implementation-Vendor: "Oracle Corporation"
Implementation-Time: "Wed Feb 19 15:54:45 2003"

Code:
SQL> create table texte(id int, text_data clob default empty_clob());

Table created.


Code:
/*
 * Created on 27.01.2005@09:50:11
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import oracle.jdbc.pool.OracleDataSource;

/**
 * @author Darimont
 * 
 * TODO Explain me
 */
public class ClobExample {

	public static void main(String[] args) {
		try {
			Thread.currentThread().getContextClassLoader().loadClass(
					"oracle.jdbc.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			OracleDataSource ods = new OracleDataSource();
			ods.setServerName("localhost");
			ods.setDatabaseName("orcl");
			ods.setUser("tom");
			ods.setPassword("mypwd");
			ods.setDriverType("oci");
			ods.setPortNumber(1521);
			//ods.setLogWriter(new PrintWriter(System.out));

			Connection con = ods.getConnection();
			PreparedStatement pstmt = con
					.prepareStatement("insert into texte (id,text_data) values(?,?)");
			pstmt.setInt(1, 1);

			File file = new File("c:/symbol3.txt");
			// Schreiben ...
			FileReader fr = new FileReader(file);
			pstmt.setCharacterStream(2,fr,(int)file.length());
			pstmt.execute();
			fr.close();
			
			// Auslesen:
			ResultSet rs = con.createStatement().executeQuery(
					"SELECT id, text_data from texte");
			ResultSetMetaData rsmd = rs.getMetaData();

			while (rs.next()) {
				int id = rs.getInt("id");
				System.out.print("id: " + id + "\t\t");

				StringWriter sWriter = new StringWriter();
				BufferedReader br = new BufferedReader(rs
						.getCharacterStream("text_data"));
				String str;

				while ((str = br.readLine()) != null) {
					sWriter.write(str);
				}
				System.out.println(" text_data: " + sWriter);
			}

			con.close();
		} catch (SQLException e1) {
			e1.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Irgendwie konnte ich mit dem thin Treiber keine text Daten einlesen bekam da immer die Fehlermeldung:
Code:
java.sql.SQLException: E/A-Exception: Connection reset
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:334)
	at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2150)
	at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2015)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2877)
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
	at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:684)
	at de.tutorials.ClobExample.main(ClobExample.java:56)

Im Trace war zu sehen:
Code:
...
DRVR OPER OracleBufferedStream.read(destbuf, offset=0, length=26)
DRVR WARN DBError.throwSqlException(e): Unable to find ORA number from exception
java.sql.SQLException: E/A-Exception: Connection reset

Na ja, mit dem OCI Treiber funktionierts allerdings bestens, kennt jemand den Grund für dieses
Phänomen?

Gruß Tom
 
Zuletzt bearbeitet:
Code:
	public ResultSet showFailedMails(Connection theConnection){
		//ResourceBundle myRessources = PropertyResourceBundle.getBundle("Result");
		ResultSet rs = null;
		
		try{
	      Statement stmt = theConnection.createStatement();
		  rs = stmt.executeQuery("SELECT MIMEBODY FROM MAIL_QUEUE WHERE STATUS LIKE 'failed'");

		} 		
		catch(SQLException e){
		}

		return rs;	
	}

Also so weit bin ich! jetzt muss ich nur das was in rs steht in einen String umwandeln und ausgeben!
Die Connection zur DB erzeuge ich in einer anderen Klasse!
Kannst mir da weiterhelfen?
 
Code:
	public ResultSet showFailedMails(Connection theConnection){
		//ResourceBundle myRessources = PropertyResourceBundle.getBundle("Result");
		ResultSet rs = null;
		
		try{
	      Statement stmt = theConnection.createStatement();
		  rs = stmt.executeQuery("SELECT MIMEBODY FROM MAIL_QUEUE WHERE STATUS LIKE 'failed'");
		  ResultSetMetaData rsmd = rs.getMetaData();
		  
		  while (rs.next()) {
			  int id = rs.getInt("id");
			  System.out.print("id: " + id + "\t\t");

			  StringWriter sWriter = new StringWriter();
			  BufferedReader br = new BufferedReader(rs.getCharacterStream("text_data"));
			  String str;

			  while ((str = br.readLine()) != null) {
				  sWriter.write(str);
			  }
			  System.out.println(" text_data: " + sWriter);
		  }
		} 		
		catch(SQLException e){
		}
		catch (IOException e) {
		  e.printStackTrace();
		}
		return rs;	
	}

was fehlt da noch damit ich den inhalt von MIMEBODY ausgeben kann? kannst du den code vielleicht etwas kommentieren bitte? ich verstehs nicht mehr wirklich sry!
 
Hallo,

die Datenbankfelder "id" und "text_data" sind die aus Tom's Beispiel-Datenbank.
Du solltest hier schon deine Feldnamen einsetzten, wobei "text_data" wohl deinem MIMEBODY entspricht.
 
und was soll id entsprechen? hab keine id sondern eine ident mit zahlen sowie buchstaben in meiner db?! meinst du mit id den primary key? und wieso schreibst du es nochmal in eine externe datei=?
 
In deinem SQL holst du doch nur ein Feld aus der DB

das hier braucht du nicht:
Code:
 	   int id = rs.getInt("id");
   	   System.out.print("id: " + id + "\t\t");
 
Hi Bernd,

jetzt gehts! danke nochmal.. kannst du vielleicht etwas zum code kommentieren?
String Writer, Buffered Reader u.s.w. damit ichs verstehe!

Code:
	try{
	      Statement stmt = theConnection.createStatement();
		  rs = stmt.executeQuery("SELECT MIMEBODY FROM MAIL_QUEUE WHERE STATUS LIKE 'failed'");
		  ResultSetMetaData rsmd = rs.getMetaData();
		  
		  while (rs.next()) {
			  StringWriter sWriter = new StringWriter();
			  BufferedReader br = new BufferedReader(rs.getCharacterStream("MIMEBODY"));
			  String str;

			  while ((str = br.readLine()) != null) {
				  sWriter.write(str);
			  }
			  System.out.println(" MIMEBODY: " + sWriter);
		  }
		  
		} 		
		catch(SQLException e){
		}
		catch (IOException e) {
		  e.printStackTrace();
		}


Danke im vorraus!
 
Zurück