java.sql.SQLException: ORA-01843: недействительный месяц - PullRequest
2 голосов
/ 06 марта 2012

Я получаю следующую ошибку при вставке данных в мою базу данных Oracle.

java.sql.SQLException: ORA-01843: not a valid month

В базе данных дата выглядит так: dd-MMM-yy (06-MAR-12)
Я конвертирую 06-03-2012 в dd-MMM-yy по следующей методике:

String s="06-03-2012";

String finalexampledt = new SimpleDateFormat("dd-MMM-yy").format(new SimpleDateFormat("dd-MM-yyyy").parse(s));

Итак, я получил 06-Mar-12, который совпадает с указанным выше форматом даты базы данных, но я получаю ошибку. Я вставляю как:

в index.jsp

 String todaydate="";

Calendar calendar1 = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
todaydate = dateFormat.format(calendar1.getTime());

<input type="text" name="datename" value="<%=todaydate%>"/>

в сервлете (doPost)

String s=request.getParameter("datename");

PreparedStatement ps=con.prepareStatement("insert into tablename(rest_dt, othercolname) values (to_date(?, 'dd-mm-yyyy'), ?)");

ps.setString(1, s);
ps.setString(2, otherstringdata);

int  rs=ps.executeUpdate();

Любая идея, пожалуйста

Ответы [ 3 ]

5 голосов
/ 06 марта 2012

так сделай

("insert into mytablename (rest_dt) values to_date(?, 'DD-MM-YYYY')");  

Попробуйте это

TO_DATE(?, 'DD-MM-YYYY','NLS_DATE_LANGUAGE = American')  

// получает от Документы Oracle

1 голос
/ 06 марта 2012

Тип данных ваших столбцов rest_dt - DATE, поэтому вам нужно указать его.Вы можете использовать функцию TO_DATE для преобразования строки в Oracle DATE, поэтому ваш оператор вставки

insert into tablename(rest_dt, othercolname) values (to_date(?, 'dd-mm-yyyy'), ?)

в порядке.

Просто убедитесь, что строказначение, которое вы привязываете к своему первому значению? - переменная имеет формат dd-mm-yyyy.И не конвертируйте и не форматируйте это значение самостоятельно: функция TO_DATE выполняет эту часть.

Здесь не нужно ничего делать с настройками сеанса, такими как nls_date_language, поскольку вы мудро решили использовать независимую от языка настройку длямесяц с маской MM (вместо MON).

С уважением,
Роб.

1 голос
/ 06 марта 2012

Проблема в том, что оракул использует NLS_DATE_LANGUAGE для получения текущего названия месяца.Таким образом, вы должны сделать

select * from nls_session_parameters

и проверить, если у вас есть правильные значения.Вы также можете проверить с помощью следующего выбора, какое имя вы получите на месяц

select  TO_CHAR(TO_DATE('01-03-01', 'DD-MM-YY'), 'MON') from dual

Я действительно не понимаю, почему вы вставляете переменную как строковое значение.Просто используйте тип даты (выполните преобразование на клиенте) в Java и вставьте его без преобразования.Если вы действительно хотите вставить его в виде строки, я бы использовал преобразование в нечто вроде dd-MM-гггг и вставил бы его с TO_DATE (, 'DD-MM-YYYY').

Редактировать:

Сделайте преобразование даты на клиенте и используйте

ps.setDate(2, <yourDate>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...