SQL查询ORA-01843

时间:2018-04-21 17:28:19

标签: sql database oracle ora-01843

我有以下DDLDML声明:

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 个答案:

答案 0 :(得分: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');

最后,另一个好的做法是在您使用Oracle时使用VARCHAR2而不是VARCHAR。目前他们的工作方式相同,但Oracle"保留了正确的#34;要更改VARCHAR以符合ANSI标准,其中NULL值和空字符串不会相同(VARCHAR2它们将始终相同)。 IOW,Oracle中VARCHAR值的行为可能会发生变化。

答案 1 :(得分:0)

当你用

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

您不会从错误YYYY-MM-DD的结果中获得YYYY-DD-MMORA-01843

此问题是由于为日期列DOBJoin_date插入了错误格式的值。

可能有两种方法可以防止此错误:

  • 假设您从上面的查询中获得DD/MM/YYYY,然后使用05-07-1990 <{1}}和DOB分别为08/01/2015列。

  • 将您的值格式设置为Join_Date to_date('1990-07-05','YYYY-MM-DD')

  • DOBto_date('2015-01-08','YYYY-MM-DD')