2015-01-29 4 views
6

Я пытаюсь импортировать данные из таблицы .xlsx, которая содержит столбцы даты. В этих столбцах даты отображаются в формате DD-MON-YY (например: 20-AUG-12).Ошибка вставки Oracle: недействительный месяц

Когда я запускаю мастер импорта, все идет хорошо, пока я не уточню отображение столбцов/полей. У меня есть отказ от ответственности, говорящий, что выбранный формат не соответствует определению поля таблицы (мое поле - поле даты). Пример вставки сценария:

INSERT INTO simulation 
      (simulation_id, 
      simulation_name, 
      sim_start_date, 
      sim_end_date, 
      status, 
      last_run_date, 
      moddat, 
      modusr, 
      notification_email) 
VALUES  (251.0, 
      'Proposal Test', 
      To_date('01-DEC-11', 'DD-MON-YY'), 
      To_date('31-DEC-11', 'DD-MON-YY'), 
      'C', 
      To_date('09-AUG-12', 'DD-MON-YY'), 
      To_date('09-AUG-12', 'DD-MON-YY'), 
      'Brent Weintz', 
      '[email protected]'); 

Когда я пытаюсь запустить этот запрос, я получил следующее сообщение об ошибке:

ORA-01843: не действительный месяц 01843. 00000 - " недействительный месяц "

Как вы можете видеть, форматы соответствуют, и я не могу понять, где проблема ... Любая идея ребята?

РЕДАКТОР: Мой параметр языка даты установлен на «FRENCH». Могу ли я изменить его на «AMERICAN»?

+3

'select * from nls_session_parameters где параметр = 'NLS_DATE_LANGUAGE';' что он дает? Возможно, язык базы данных не является американским. –

+0

как выглядит таблица? – Sathya

+0

@MaheswaranRavisankar, именно то, что я собирался сказать, но я скорее разместил его как ответ. –

ответ

6

Несмотря на то, что вы используете to_date и исправьте модель формата для явного преобразования в дату, все еще получая ORA-01843, похоже, проблема связана с NLS_DATE_LANGUAGE. Узнайте больше об этом here.

SQL> DROP TABLE t PURGE; 

Table dropped. 

SQL> CREATE TABLE t(A DATE); 

Table created. 

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='FRENCH'; 

Session altered. 

SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE'; 

PARAMETER   VALUE 
-------------------- ---------- 
NLS_DATE_LANGUAGE FRENCH 

SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy')); 
INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy')) 
          * 
ERROR at line 1: 
ORA-01843: not a valid month 

Итак, я сталкиваюсь ошибка с неправильным NLS_DATE_LANGUAGE. Давайте установим его в AMERICAN.

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 

Session altered. 

SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE'; 

PARAMETER   VALUE 
-------------------- ---------- 
NLS_DATE_LANGUAGE AMERICAN 

SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy')); 

1 row created. 

SQL> 

UPDATE Для редактируемого вопрос OP в -

Мой язык В параметре установлено значение "ФРАНЦУЗСКИЙ". Могу ли я изменить его на «AMERICAN»?

От documentation, Ниже приведены способы установки параметров NLS. Обратите внимание на порядок приоритета.

enter image description here

10

Попробуйте указать NLS_DATE_LANGUAGE как paremeter для функции TO_DATE.

INSERT INTO simulation 
      (simulation_id, 
      simulation_name, 
      sim_start_date, 
      sim_end_date, 
      status, 
      last_run_date, 
      moddat, 
      modusr, 
      notification_email) 
VALUES  (251.0, 
      'Proposal Test', 
      To_date('01-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
      To_date('31-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
      'C', 
      To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
      To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
      'Brent Weintz', 
      '[email protected]'); 

Конечно, вы можете изменить его с помощью сеанса alter, если вы собираетесь выполнить несколько запросов.

Смежные вопросы