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

时间:2014-03-02 04:37:09

标签: java

以下是信息:

  1. 我有一个字符串
  2. 我想在一个表中插入一条记录,其中的字符串在一列中 数据类型为CLOB
  3. 我想使用预备陈述的setClob()方法。
  4. 所以我的问题是如何从这个String创建一个Clob对象,以便我 可以使用setClob()方法。

    提前致谢, 纳温

6 个答案:

答案 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);
}

这对我和其他人来说都是成功的!