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