CLOB v_clob = CLOB.createTemporary(con,false,CLOB.DURATION_SESSION);
v_clob.putString(1, text);
ps.setClob(2,v_clob);
v_clob.freeTemporary();
4001 символ в CLOB из Java или как проинсертить CLOB из Java через oraclethin?
Есть купленная система на Java, база на Oracle, используем «драйвера» базы данных oraclethin (Implementation-Time: "Thu Oct 7 23:02:07 2004").
Только новая версия oraclethin имеет метод setStringForClob, а наша не имеет. Но её установка не совместима с нашей системой, как сказано на сайте поддержки.
А обычный старый метод вызывает ошибку в драйвере oraclethin (какой-то кривой там createTemporary):
Код:
А что просто втайпить много букафф в sql нельзя? Ну тоесть не как параметр препаред стейтмента, а конкатенацией.
Ето конечно криво и я не уверен что будет роботать но если получется, а иначе проблему обойти нельзя - то чем не солюшен :)
ЗЫ. Я вообще с Ораклом из джавы не роботал и не совсем понимаю что именно oraclethin.
Сие JDBC драйвер или Оракл-клиен какойто? Если JDBC драйвер то может попробовать декомпильнуть и поглядеть где ж именно проблема? (Не пинайте ежели глупость сказал по своему невединью)
[COLOR=DimGray]А раздел-то для темы в самый раз. Ага.[/COLOR]
Цитата: makbeth
[COLOR=DimGray]А раздел-то для темы в самый раз. Ага.[/COLOR]
Ето потому что у топикавтора серия вопросов про Оракул. Накатом сюда запостил. :)
Кстати да. Модераторы, перенесите плиз тему в Джаву. Может там скорее помогул.
Цитата: Rebbit
А что просто втайпить много букафф в sql нельзя? Ну тоесть не как параметр препаред стейтмента, а конкатенацией.
Это первое, что я сделал.
Втайпить много букав - скажет, что больше 4000 символов нельзя.
Сделать конкатенацию - скажет, что ошибка конкатенации.
Цитата: yegorkin
Это первое, что я сделал.
Втайпить много букав - скажет, что больше 4000 символов нельзя.
Сделать конкатенацию - скажет, что ошибка конкатенации.
Втайпить много букав - скажет, что больше 4000 символов нельзя.
Сделать конкатенацию - скажет, что ошибка конкатенации.
Я когдато на роботе слишал от опытных людей что в Оракула есть глюк какойто при котором нельзя ЦЛОБ/БЛОБ винсертить. И что мол нужно сначала просто строку винсертить, а потом редактировать.
Вот похоже и в сети о таком пишут
http://www.coderanch.com/t/299217/JDBC/java/Help-inserting-Clob-into-Oracle
Код:
// 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();
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();
Цитата: Rebbit
Кстати да. Модераторы, перенесите плиз тему в Джаву. Может там скорее помогул.
А теперь верните обратно в раздел Oracle. Это явно прикол базы, а не Java :)