Запрос sql ORA-01843

Humaid Kidwai спросил: 28 марта 2018 в 03:48 в: sql

У меня есть следующие операторы 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 ответа

David Faber ответил: 28 марта 2018 в 05:31

Здесь проще всего использовать литералы даты 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 может измениться.

Humaid Kidwai ответил: 30 марта 2018 в 01:55
Я скопировал ваш запрос, и теперь я получаю ORA-01438: значение, превышающее указанную точность, разрешенную для этого столбца
David Faber ответил: 30 марта 2018 в 01:57
Номер пин-кода слишком велик. Вы указали 5 цифр точности при создании таблицы - шестизначное число (403001) не будет работать. Извините, я не заметил этого раньше.
Humaid Kidwai ответил: 30 марта 2018 в 02:32
огромное спасибо
David Faber ответил: 30 марта 2018 в 03:04
Пожалуйста, примите / подтвердите мой ответ, если он был вам полезен.
Barbaros Özhan ответил: 28 марта 2018 в 04:42

Похоже, что при запросе с

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')