2014-03-02 48 views
4

這裏是信息:如何PreparedStatement的inJDBC使用的setClob()

  1. 我有一個字符串
  2. 我要插入與弦的表中的記錄,其 列數據類型爲CLOB
  3. 我想用setClob()的方法編寫預備。

所以我的問題是如何從這個字符串創建一個Clob對象,以便我 可以使用setClob()方法。

由於提前, 納文

+0

看那'Connection'的javadoc。有一個'createClob()'方法。 –

回答

1

對於CLOB是字符串的了。所以,只需使用.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是最後一個索引。

+0

如果你使用set String,如果字符串太大,我可能會有錯誤,我發現這個問題,因爲我有這個錯誤「setString只能處理少於32766個字符的字符串」,而使用setString作爲clob字段 – valepu

5

如果要將字符串寫入CLOB列,只需使用PreparedStatement.setString即可。

如果你想知道如何創建一個CLOB從字符串,這是它

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

你可以從一個連接對象創建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); 
+0

第一個方法有效,但clob中的最小位置是1. – mrod

+0

@mrod感謝您的通知。你是對的。這是我的粗心。我糾正了它。 – Visruth

1

今天我有一個Clob字段的問題,因爲我使用「setString」來設置的參數,但隨後一邊用很長的字符串測試我有這個錯誤:「了setString只能處理少於32766個字符的字符串」

我用connection.createClob,但它給了我這個例外:

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

所以找這個例外,我發現這個 using CLOB in java throwing exception和接受的答案(使用中的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); 
1

我有這個問題的具體變化,需要從運行在該數據庫上的Java代碼插入到Oracle數據庫的clob。這裏沒有任何答案對我很有用。

我終於找到解決方案,訣竅就是使用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; 
相關問題