Как вставить большие данные Clob (> 4K символов) в Oracle 10g, используя JDBC - PullRequest
2 голосов
/ 13 июля 2011

Не могли бы вы, ребята, скажите, пожалуйста, как вставить данные clob с помощью jdbc. Я использую базу данных oracle10g.

Мне удалось вставить данные сгустка длиной <4000, используя следующие 2 метода </p>

1

tempClob.length()<4000){
   pstmnt.setClob(colNumber, tempClob );
}

2.

tempClob.length()<4000){
   Reader reader =tempClob.getCharacterStream();
   pstmnt.setClob(colNumber, tempClob );
   pstmnt.setCharacterStream(colNumber, reader, new Long(tempClob.length()).intValue());
}

Когда длина данных сгустка велика, например, около 29 КБ, оба эти метода не работают.

Ответы [ 4 ]

1 голос
/ 21 мая 2013

Это работает на oracle11g jdk5

tempClob.length()<4000){
    byte[] bytes = tempClob.getBytes();
    pstmnt.setCharacterStream(2, new StringReader(new String( bytes  )), bytes.length);
}
0 голосов
/ 13 июля 2011

пытались ли вы проверить максимальный размер поля ... SELECT LENGTH(clobfield) FROM table

посмотреть, может ли поле вместить размер ..

0 голосов
/ 19 июля 2011

Вот код сома, который я нашел, лежащий вокруг, который, я думаю, делает то, что вы хотите:

У меня есть такой статический метод:

public class DBUtil {
public static CLOB getCLOB(String innStr, Connection conn) throws SQLException, 
                                                   IOException {
  CLOB tempClob = null;
    // If the temporary CLOB has not yet been created, create new
    tempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);

    // Open the temporary CLOB in readwrite mode to enable writing
    tempClob.open(CLOB.MODE_READWRITE);
    // Get the output stream to write
    Writer tempClobWriter = tempClob.getCharacterOutputStream();
    // Write the data into the temporary CLOB
    tempClobWriter.write(innStr);

    // Flush and close the stream
    tempClobWriter.flush();
    tempClobWriter.close();

    // Close the temporary CLOB
    tempClob.close();
  return tempClob;
}
}

И тогда вы можете использовать его примерно так:

CLOB tempClob = DBUtil.getCLOB(longString, connection);
pstmt.setCLOB(colnumber, tempClob);

Для этого требуется, чтобы весь контент сгустка был в строке, поэтому он все загружен в память, возможно, не подходит для вас, но он работает для моих простых нужд.

РЕДАКТИРОВАТЬ: Вероятно, я должен отметить, что я использовал этот код с вызовом процедуры plsql. Я не проверял это напрямую с помощью sql

0 голосов
/ 13 июля 2011

Если вы используете Oracle 11g, вам понадобятся драйверы отсюда: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

ojdbc5.jar для JDK 1.5 или ojdbc6.jar для JDK 1.6

Банку нужно будетвключены в ваш classpath.

Удивительно, но Oracle 11g может хранить Clob от 8 до 128 терабайт.

...