我有以下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的错误。那么,问题可能是什么呢?
发布于 2018-04-22 03:11:40
这里最简单的做法是使用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“保留权利”更改VARCHAR以满足ANSI值和空字符串不同的ANSI值标准(对于VARCHAR2,它们将始终相同)。也就是说,Oracle中的VARCHAR值的行为可以改变。
发布于 2018-04-22 02:13:44
似乎当您使用
select * from nls_session_parameters p where p.parameter = 'NLS_DATE_FORMAT';您不会从error ORA-01843的结果中获得YYYY-MM-DD或YYYY-DD-MM。
此问题是由于为日期列DOB和Join_date__插入格式错误的值造成的。
有两种方法可以防止此错误:
DD/MM/YYYY,然后对DOB使用05-07-1990,对Join_Date列使用08/01/2015,对于Join_Date,将值respectively.
to_date('1990-07-05','YYYY-MM-DD') (对于DOB )和<DOB>d17https://stackoverflow.com/questions/49958387
复制相似问题