SQL запрос ORA-01843

У меня есть следующее DDL а также DML заявления:

create table emp_details (
ID number(2) constraint t_pk primary key,
F_Name varchar(10) not null,
L_Name varchar(10) not null,
DOB date,
Mob_no number(10),
City varchar(10),
PIN number(5),
Gender char(1),
Designation varchar(15),
Join_Date date,    
);

insert into emp_details values (01,'John','Wick','1990-07-05',9856482358,'Goa',403001,'M','SDE II', '2015-01-08');

тогда я получаю ошибку ORA-01843, Итак, в чем может быть проблема?

2 ответа

Здесь проще всего использовать литералы даты ANSI вместо строк для дат (использование строк будет зависеть от значения NLS_DATE_FORMAT и вы не хотите поиграть с этим, если вам не нужно):

INSERT INTO emp_details
VALUES
  ( 01, 'John', 'Wick', DATE'1990-07-05', 9856482358
  , 'Goa', 403001, 'M', 'SDE II', DATE'2015-01-08');

Я должен добавить, что явное перечисление столбцов, в которые вы вставляете значения, является хорошей привычкой. В противном случае ваш INSERT запрос будет прерван, если вы или кто-то еще добавите столбец из вашей таблицы:

INSERT INTO emp_details
  ( id, f_name, l_name, dob, mob_no, city, pin, gender, designation, join_date )
VALUES
  ( 01, 'John', 'Wick', DATE'1990-07-05', 9856482358
  , 'Goa', 403001, 'M', 'SDE II', DATE'2015-01-08');

Наконец, еще одна хорошая практика заключается в использовании VARCHAR2 вместо VARCHAR когда вы работаете с Oracle. В настоящее время они работают одинаково, но Oracle "оставляет за собой право" изменить VARCHAR встретиться со стандартом ANSI, в соответствии с которым NULL значения и пустая строка не будут одинаковыми (с VARCHAR2 они всегда будут одинаковыми). IOW, поведение VARCHAR значения в Oracle могут меняться.

Кажется, когда вы запрашиваете с

select * from nls_session_parameters p where p.parameter = 'NLS_DATE_FORMAT';

ты не получишь YYYY-MM-DD или же YYYY-DD-MM от вашего результата ошибки ORA-01843,

Эта проблема из-за вставки неправильно отформатированного значения для столбцов даты DOB а также Join_date ,

Существует два способа предотвратить эту ошибку:

  • Предположим, вы получаете DD/MM/YYYY из запроса выше, затем используйте 05-07-1990 за DOB, а также 08/01/2015 за Join_Date столбцы соответственно.

  • Отформатируйте ваши значения как to_date('1990-07-05','YYYY-MM-DD') за DOB а также to_date('2015-01-08','YYYY-MM-DD') за Join_Date

Другие вопросы по тегам