#java #oracle #sqlexception
#java #Oracle #sqlexception
Вопрос:
insertSQL = "insert into TELBP_INPUT_LOG (SERIAL_NO, INPUT_XML) values (?, ?)";
statement = connection.prepareStatement(insertSQL);
statement.setString(1, serialNo);
statement.setString(2, inXml);
//statement.setString(2, "test");
insertCount = statement.executeUpdate();
когда программа запускается для executeUpdate(), ошибка
java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column
выдается, но если я скопирую значение SerialNo и inXml и запущу в SQL developer, ошибка не выдается, в чем причина?
версия oracle: Oracle Database 10g Enterprise Edition Версия 10.2.0.4.0 — 64bi
столбец:
SERIAL_NO VARCHAR2(22)
INPUT_XML CLOB
Websphere: Websphere 5.1
jdbc: оба ojdbc14 и ojdbc6 опробованы, оба имеют одинаковую ошибку
Комментарии:
1. Какие типы столбцов SERIAL_NO и INPUT_XML?
Ответ №1:
Вы не можете записать строку в столбец Clob.
Вместо
statement.setString(2, inXml);
использовать
statement.setClob(2, xmlClob);
Сначала вам нужно создать xmlClob:
Clob xmlClob = connection.createClob();
Writer clobWriter = myClob.setCharacterStream(1);
clobWriter.write(inXml);
Комментарии:
1. createClob() — это java 1.6 API, я просто использую java 1.4, так что любой другой метод? и еще одна информация, в другой серверной среде, использующей websphere 7 и java 1.6 и использующей тот же код (setString()), у него нет никаких ошибок!! почему?
2. Я пытался найти 1.4 Javadoc в Интернете, но он такой старый, что я не могу его найти. Если у него действительно нет метода setClob(), вам может потребоваться использовать API, специфичный для Oracle. Что касается 1.6, возможно, что эта более новая версия автоматически преобразует строки в Clobs для вас.
3. ((oracle.jdbc. OracleResultSet) Набор результатов).getCLOB(«clob_column»); Writer writer = clob.getCharacterOutputStream(); writer.write(toStore. toCharArray()); writer . flush(); writer.close();
Ответ №2:
для clob
поля, которое вы можете использовать. setClob(..)
setString():Sets the designated parameter to the given Java String value. The driver converts this to an SQL VARCHAR or LONGVARCHAR value (depending on the argument's size relative to the driver's limits on VARCHAR values) when it sends it to the database.
Ответ №3:
Java (базовый драйвер) обрабатывает CLOB как поток символов. Когда вы когда-либо устанавливаете String , базовая реализация драйвера автоматически выполнит соответствующее преобразование (строка в Varchar и т. Д.). Поскольку CLOB — это особый тип, ответственность за выполнение необходимых шагов лежит на программисте. Перейдите по ссылке, чтобы узнать, как вставить clob с помощью java: http://docs.oracle.com/javase/tutorial/jdbc/basics/blob.html