如何在JPD中的PreparedStatement中使用setClob()
以下是信息:
- 我有一个字符串
- 我想在一个表中插入一个记录,其中String的数据类型为
CLOB
。 - 我想使用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;