0

我有以下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. 那么,可能是什么问题?

4

2 回答 2

2

NLS_DATE_FORMAT这里最简单的做法是使用 ANSI 日期文字而不是字符串作为日期(使用字符串取决于

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,VARCHAROracle 中值的行为可以改变。

于 2018-04-21T19:11:40.453 回答
0

似乎当您查询时

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

你不会得到YYYY-MM-DDYYYY-DD-MM从你的错误结果中得到ORA-01843

此问题是由于为日期列DOBJoin_date.

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

  • 假设您DD/MM/YYYY从上面的查询中得到,然后分别使用05-07-1990for DOB08/01/2015forJoin_Date列。

  • 将您的值格式化为to_date('1990-07-05','YYYY-MM-DD')for DOBto_date('2015-01-08','YYYY-MM-DD')forJoin_Date

于 2018-04-21T18:13:43.527 回答