Ошибка "Литерал не соответствует строке формата"
Когда я пытаюсь выполнить приведенный ниже код, это дает мне java.sql.SQLException: ORA-01861: literal does not match format string
ошибка.
Я пытаюсь скопировать некоторые значения столбца из customer1_details
стол к customer2_details
Таблица. Тип данных столбцов, который я пытаюсь переместить, TIMESTAMP(6)
за TIME_REGISTERED
, DATE_DISCHARGED
столбцы и тип данных для DATE_OF_BIRTH
столбец DATE
try
{
Connection conn=Address.getOracleConnection();
int id = 1;
Date dob = null;
Timestamp timereg = null,datedischarged = null;
Statement stmt=conn.createStatement();
ResultSet res=stmt.executeQuery("SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH from customer1_details WHERE customer_id = '"+id+"' ");
if(res.next())
{
timereg=res.getTimestamp("TIME_REGISTERED");
datedischarged=res.getTimestamp("DATE_DISCHARGED");
dob=res.getDate("DATE_OF_BIRTH");
}
String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) "
+ "VALUES('"+timereg+"','"+datedischarged+"','"+dob+"','"+id+"') ";
PreparedStatement pst=conn.prepareStatement(sql1);
pst.executeUpdate();
pst.close();
conn.close();
}
catch(Exception e)
{ System.out.print(e); }
Будет более полезно, если кто-нибудь даст ответ without using INSERT INTO ... SELECT ... statement
,
3 ответа
Вы можете сделать это в одном выражении с помощью запроса:
"INSERT INTO customer2_details (TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID)
SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH, customer_id
from customer1_details WHERE customer_id = '"+id+"' "
Читайте метки времени как строки с getString();
ИЛИ вызовите toString() в экземплярах объекта java Timestamp.
String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) "
+ "VALUES('"+timereg.toString()+"','"+datedischarged.toString()+"','"+dob.toString()+"','"+id+"') ";
Скорее всего, это вызвано передачей переменных Date и Timestamp в виде строк в оператор вставки.
Когда вы вставляете или обновляете значения Date или Timestamp, существует формат по умолчанию, в котором вы можете передавать эти значения в виде строк. То, что вы передаете, является идеей Java о том, как преобразовать даты и метки времени в строки. Эти два, кажется, не совпадают.
Лучше всего, вероятно, использовать переменные связывания, тогда об этом должна позаботиться инфраструктура.
Альтернативой может быть использование функции Oracle to_date(), где вы можете указать строку формата. Затем вы должны определить форматную строку, которая рассматривает способ представления дат в виде строк в формате Java. Однако я не уверен, зависит ли представление Java от локали. Если это так, вам придется написать собственный метод date_to_string(), который всегда возвращает даты в одном и том же формате, иначе ваша программа может работать на некоторых компьютерах, но не на других с другим языковым стандартом.
И, наконец, вы можете сделать вставку-выборку, которая полностью обходит слой Java.