Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

4001 символ в CLOB из Java или как проинсертить CLOB из Java через oraclethin?

30K
18 января 2010 года
yegorkin
11 / / 24.10.2007
Как проинсертить CLOB из Java через старый oraclethin?

Есть купленная система на Java, база на Oracle, используем «драйвера» базы данных oraclethin (Implementation-Time: "Thu Oct 7 23:02:07 2004").
Только новая версия oraclethin имеет метод setStringForClob, а наша не имеет. Но её установка не совместима с нашей системой, как сказано на сайте поддержки.

А обычный старый метод вызывает ошибку в драйвере oraclethin (какой-то кривой там createTemporary):

 
Код:
CLOB v_clob = CLOB.createTemporary(con,false,CLOB.DURATION_SESSION);  
v_clob.putString(1, text);  
ps.setClob(2,v_clob);  
v_clob.freeTemporary();
276
19 января 2010 года
Rebbit
1.1K / / 01.08.2005
Я с проблемой не сталкивался, но у меня возникла мисль :)
А что просто втайпить много букафф в sql нельзя? Ну тоесть не как параметр препаред стейтмента, а конкатенацией.
Ето конечно криво и я не уверен что будет роботать но если получется, а иначе проблему обойти нельзя - то чем не солюшен :)

ЗЫ. Я вообще с Ораклом из джавы не роботал и не совсем понимаю что именно oraclethin.
Сие JDBC драйвер или Оракл-клиен какойто? Если JDBC драйвер то может попробовать декомпильнуть и поглядеть где ж именно проблема? (Не пинайте ежели глупость сказал по своему невединью)
303
19 января 2010 года
makbeth
1.0K / / 25.11.2004
[COLOR=DimGray]А раздел-то для темы в самый раз. Ага.[/COLOR]
276
19 января 2010 года
Rebbit
1.1K / / 01.08.2005
Цитата: makbeth
[COLOR=DimGray]А раздел-то для темы в самый раз. Ага.[/COLOR]


Ето потому что у топикавтора серия вопросов про Оракул. Накатом сюда запостил. :)

Кстати да. Модераторы, перенесите плиз тему в Джаву. Может там скорее помогул.

30K
19 января 2010 года
yegorkin
11 / / 24.10.2007
Цитата: Rebbit
А что просто втайпить много букафф в sql нельзя? Ну тоесть не как параметр препаред стейтмента, а конкатенацией.



Это первое, что я сделал.

Втайпить много букав - скажет, что больше 4000 символов нельзя.
Сделать конкатенацию - скажет, что ошибка конкатенации.

276
19 января 2010 года
Rebbit
1.1K / / 01.08.2005
Цитата: yegorkin
Это первое, что я сделал.

Втайпить много букав - скажет, что больше 4000 символов нельзя.
Сделать конкатенацию - скажет, что ошибка конкатенации.



Я когдато на роботе слишал от опытных людей что в Оракула есть глюк какойто при котором нельзя ЦЛОБ/БЛОБ винсертить. И что мол нужно сначала просто строку винсертить, а потом редактировать.
Вот похоже и в сети о таком пишут
http://www.coderanch.com/t/299217/JDBC/java/Help-inserting-Clob-into-Oracle

30K
20 января 2010 года
yegorkin
11 / / 24.10.2007
Точно! Спасибо, работает:

Код:
// Unfortunately you cannot insert a clob in one statement: http://www.coderanch.com/t/299217/JDBC/java/Help-inserting-Clob-into-Oracle
      Connection con = x.getConnection(connectionkey);
      // get unique id for further SQL iterations
      Statement stm = con.createStatement();
      ResultSet rs = stm.executeQuery("select data_seq.nextval as rec_uid from dual");
      long rec_uid;
      try {
        if (!rs.next()) throw new SQLException("Can not obtain id for data");
        rec_uid = rs.getLong("rec_uid");
      }
      finally {
        stm.close();
      };
      // insert non-CLOB data data and the unique id
      PreparedStatement ps=con.prepareStatement("insert into datahtml (touser, fromuser, subject, message, sid2) values (?, ?, ?, empty_clob(), ?)");
      try {
        ps.setString(1,dataTo); ps.setString(2,dataFrom); ps.setString(3,dataSubject); ps.setLong(4,rec_uid);
        ps.executeUpdate();
      }
      finally {
        ps.close();
      };
      // select the clob locator back
      oracle.sql.CLOB clob;
      ps = con.prepareStatement("select message from datahtml where sid2 = ? for update nowait");
      try {
        ps.setLong(1,rec_uid);
        rs = ps.executeQuery();
        if (!rs.next()) throw new SQLException("Can not select data text CLOB");
        clob = ((oracle.jdbc.OracleResultSet)rs).getCLOB("message");
      }
      finally {
        ps.close();
      };
      // write CLOB data
      java.io.BufferedWriter bw = new java.io.BufferedWriter(clob.getCharacterOutputStream());
      try {
        bw.write(dataBIG);
        bw.flush();
      }
      finally {
        bw.close();
      };
      // commit
      con.commit();
30K
20 января 2010 года
yegorkin
11 / / 24.10.2007
Цитата: Rebbit
Кстати да. Модераторы, перенесите плиз тему в Джаву. Может там скорее помогул.



А теперь верните обратно в раздел Oracle. Это явно прикол базы, а не Java :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог