如何在JPD中的PreparedStatement中使用setClob()

以下是信息:

  1. 我有一个字符串
  2. 我想在一个表中插入一个记录,其中String的数据类型为CLOB
  3. 我想使用preparedstatement的setClob()方法。

所以我的问题是如何从这个String创建一个Clob对象,以便我可以使用setClob()方法。

提前谢谢,Naveen

如果要将字符串写入CLOB列,只需使用PreparedStatement.setString

如果你想知道如何从String创建CLOB就是这样

  Clob clob = connection.createClob(); clob.setString(1, str); 

您可以从连接对象创建clob,如下所示

 Connection con = null;// write code to make a connection object Clob clob = con.createClob(); String str = "this is a stirng"; clob.setString(1, str ); PreparedStatement ps = null;// write code to create a prepared statement ps.setClob(4, clob); 

或者您可以尝试以下替代代码:

 //alternative way String str = "this is a stirng"; ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); int parameterIndex = 1; PreparedStatement ps = null;// write code to create a prepared statement ps.setClob(parameterIndex, inputStreamReader); 

对于CLOB,它已经是String。 所以,只需使用.setString()即可。 关于ORACLE jdbc的一件事,如果您正在使用它,它就像CLOB INPUT参数一样,是您语句中的最后一个参数,特别是对于大数据。

例:

 INSERT INTO MY_TABL (NUM_COL, VARC_COL, VARC_COL, TS_COL, CLOB_COL) VALUES(?,?,?,?,?); 

正如您所看到的,CLOB_COL的类型为CLOB,应该是最后一个,以便在执行时.setString(5)和5是最后一个索引。

今天我遇到了Clob字段的问题,因为我使用“setString”来设置参数,但是在使用非常长的字符串进行测试时我遇到了这个错误:“setString只能处理少于32766个字符的字符串”

我使用了connection.createClob,但它给了我这个例外:

 java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.createClob()Ljava/sql/Clob; 

所以寻找这个exception我发现这个在java抛出exception中使用CLOB并且接受的答案(使用setCharacterStream而不是setClob)对我有用

从接受的答案中复制/粘贴(因此所有学分均为a_horse_with_no_name)

 StringReader reader = new StringReader(userAbout); PreparedStatement insertClob = dbCon.prepareStatement("UPDATE user_data SET user_about=? WHERE user_id=?"); insertClob.setCharacterStream(1, reader, userAbout.length()); insertClob.setInt(2,userId); 

我有一个特定的变体,需要从该数据库上运行的java代码中将clob插入Oracle数据库。 这里的答案都没有对我有用。

我最终找到了解决方案,诀窍是使用oracle.sql.CLOB

这是我发现的方法:

 create table test_clob ( c clob ); create or replace and compile java source named java_clob_insert as import java.sql.Connection; import java.sql.PreparedStatement; import oracle.sql.CLOB; import java.io.Writer; public class JavaClobInsert { public static void doInsert () { try { //create the connection and statement Connection oracleConn = (new oracle.jdbc.OracleDriver()).defaultConnection(); String stmt = "INSERT INTO test_clob values (?)"; PreparedStatement oraclePstmt = oracleConn.prepareStatement(stmt); //Imagine we have a mysql longtext or some very long string String s = ""; for (int i = 0; i < 32768; i++) { s += i % 10; } //Initialise the Oracle CLOB CLOB clob; clob = CLOB.createTemporary(oracleConn, true, CLOB.DURATION_CALL); //Good idea to check the string is not null before writing to clob if (s != null) { Writer w = clob.setCharacterStream( 1L ); w.write(s); w.close(); oraclePstmt.setClob(1, clob); } else { oraclePstmt.setString(1, ""); } //clean up oraclePstmt.executeUpdate(); oracleConn.commit(); oraclePstmt.close(); oracleConn.close(); } catch (Exception e) { e.printStackTrace(); } } } / create or replace procedure clob_insert as language java name 'JavaClobInsert.doInsert()'; / begin clob_insert; end; / select * from test_clob;