我有以下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
的错误。那么,可能是什么问题呢?
答案 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-MM
或ORA-01843
。
此问题是由于为日期列DOB
和Join_date
插入了错误格式的值。
可能有两种方法可以防止此错误:
假设您从上面的查询中获得DD/MM/YYYY
,然后使用05-07-1990
<{1}}和DOB
分别为08/01/2015
列。
将您的值格式设置为Join_Date
to_date('1990-07-05','YYYY-MM-DD')
DOB
和to_date('2015-01-08','YYYY-MM-DD')