以下是信息:
CLOB
。setClob()
方法。所以我的问题是如何从这个String创建一个Clob
对象,以便我
可以使用setClob()
方法。
提前致谢, 纳温
答案 0 :(得分:7)
如果要将字符串写入CLOB列,只需使用PreparedStatement.setString
。
如果您想知道如何从String创建CLOB,那就是
Clob clob = connection.createClob();
clob.setString(1, str);
答案 1 :(得分:6)
您可以从连接对象创建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);
答案 2 :(得分:1)
对于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,应该是last,以便何时 你做.setString(5)和5是最后一个索引。
答案 3 :(得分:1)
今天我遇到了Clob字段的问题,因为我使用“setString”来设置参数,但是在使用非常长的字符串进行测试时我遇到了这个错误:“setString只能处理少于32766个字符的字符串”
我使用了connection.createClob,但它给了我这个例外:
java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.createClob()Ljava/sql/Clob;
所以我找到了这个例外
demonstration
和接受的答案(使用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);
答案 4 :(得分:1)
我有一个特定的变体,需要从该数据库上运行的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;
答案 5 :(得分:0)
我的回答与其他人略有不同...
我有一个PreparedStatement stmt
,并且正在使用stmt.setString(colIndex, value)
来更新具有CLOB列的数据库。
当我在数据库表中插入和更新行时,对我来说这确实奏效。
当其他人测试此代码时,尽管他们偶尔会看到异常发生:
ORA-22275: invalid LOB locator
它似乎仅在更新时发生,而不是在插入时发生-不知道为什么在value
为空的情况下这样做。而且我只在Oracle数据库而不是MSSQL或DB2中发生过这种情况。
无论如何修复,我更改了逻辑以测试空值
if (value == null) {
stmt.setNull(colIndex, java.sql.Types.CLOB);
}
else {
stmt.setString(colIndex, value);
}
这对我和其他人来说都是成功的!