String to CLOB (Oracle Datentyp)

Hi Leute!

Versuche verzweifelt im Java aus meinem String Datentyp eine CLOB Datei zu erzeugen, die ich dann später als Argument an meine Oracle Datenbank schreibe…

Hat jemand eine Hilfe für mich?
Codeschnipsel?
LG, Klaus

Hallo Klaus,

am Besten erzeugst Du zuerst ein Prepared Statement, bei dem Du das CLOB Feld als ? einsetzt.
Dann kannst Du die Bindevariablen durch den String ersetzen. Das Prepared Statement nimmt auf jeden Fall einen InputStream an. Wenn Du den String nicht direkt reinbekommst (Wäre dann Fehlermeldung: kann String nicht in CLOB konvertieren) must Du diesen in einen ByteStream umwandeln. Sollte eine Methode von String sein.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hätte folgendes Versucht zur Umwandlung:

public void setdataPackage(Document data, float cid) {
Connection conn = null;
CallableStatement cs = null;

try {
conn= pool.getConnection(2000);
conn.setAutoCommit(false);

CLOB newClob = CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_CALL);
newClob.setString(1, data.toString());

if(conn != null){
cs = conn.prepareCall("{call SETDATAPACKAGE(?, ?)");
try{
//Inputvalues
cs.setClob(1, newClob);
cs.setFloat(2, cid);

// execute PROCEDURE
cs.execute();
}
catch(Exception e){
System.out.println("CLOB Exception: "+ e);
}
cs.close();
}
else
System.out.println(„Connection faild!!!“);
}
catch (SQLException e) {
System.out.println("setDataPackage Exception: "+ e);
}
finally{
try{
conn.close();
}
catch(SQLException e){
System.out.println("Connection Close Exception: "+ e);
}
}
}

Fehler:
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: snaq.db.CacheConnection
at oracle.sql.CLOB.createTemporary(CLOB.java:754)
at oracle.sql.CLOB.createTemporary(CLOB.java:716)
at logon.Database.setdataPackage(Database.java:114)
at org.apache.jsp.db_jsp._jspService(org.apache.jsp.db_jsp:153)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Leute!

Versuche verzweifelt im Java aus meinem String Datentyp eine
CLOB Datei zu erzeugen, die ich dann später als Argument an
meine Oracle Datenbank schreibe…

Hat jemand eine Hilfe für mich?
Codeschnipsel?
LG, Klaus

Hallo Klaus,

am Besten erzeugst Du zuerst ein Prepared Statement, bei dem
Du das CLOB Feld als ? einsetzt.
Dann kannst Du die Bindevariablen durch den String ersetzen.
Das Prepared Statement nimmt auf jeden Fall einen InputStream
an. Wenn Du den String nicht direkt reinbekommst (Wäre dann
Fehlermeldung: kann String nicht in CLOB konvertieren) must Du
diesen in einen ByteStream umwandeln. Sollte eine Methode von
String sein.

Gruß

Peter

Hätte folgendes Versucht zur Umwandlung:

public void setdataPackage(Document data, float cid) {
Connection conn = null;
CallableStatement cs = null;

try {
conn= pool.getConnection(2000);
conn.setAutoCommit(false);

CLOB newClob = CLOB.createTemporary(conn, false,
oracle.sql.CLOB.DURATION_CALL);
newClob.setString(1, data.toString());

if(conn != null){
cs = conn.prepareCall("{call SETDATAPACKAGE(?, ?)");

Vielleicht ist Dein Problem auch ganz peinlich: Stimmt die Reihenfolge der Attribute? Dann würdest Du nämlich CLOB und FLOAT vertauschen.

try{
//Inputvalues

Versuch hier mal:
PreparedStatement cs = conn.createPreparedStatement(„INSERT INTO meinetab (clobattr, key) VALUES ( ?,?)“);

cs.setClob(1, newClob);
cs.setFloat(2, cid);

cs.executeUpdate();

// execute PROCEDURE
cs.execute();
}
catch(Exception e){
System.out.println("CLOB Exception: "+ e);
}
cs.close();
}
else
System.out.println(„Connection faild!!!“);
}
catch (SQLException e) {
System.out.println("setDataPackage Exception: "+ e);
}
finally{
try{
conn.close();
}
catch(SQLException e){
System.out.println("Connection Close Exception: "+ e);
}
}
}

Fehler:
SCHWERWIEGEND: Servlet.service() for servlet jsp threw
exception
java.lang.ClassCastException: snaq.db.CacheConnection
at oracle.sql.CLOB.createTemporary(CLOB.java:754)
at oracle.sql.CLOB.createTemporary(CLOB.java:716)
at logon.Database.setdataPackage(Database.java:114)
at
org.apache.jsp.db_jsp._jspService(org.apache.jsp.db_jsp:153)
at
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

Versuch hier mal:
PreparedStatement cs = conn.createPreparedStatement(„INSERT
INTO meinetab (clobattr, key) VALUES ( ?,?)“);

was sind hierbei clobattr und key?

Na rate doch mal. Deine Tabelle besteht doch aus mindestens einem Schlüsselattribut und eben dem CLOB.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]