sql 查询 ORA-01843
Posted
技术标签:
【中文标题】sql 查询 ORA-01843【英文标题】:sql query ORA-01843 【发布时间】:2018-04-21 17:28:18 【问题描述】:我有以下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
的错误。那么,可能是什么问题?
【问题讨论】:
我收到错误 ORA-01843 not a valid month 我尝试插入 null 但不起作用我尝试使用 to_date('19900705','yyyymmdd') 但没有帮助 您的日期缺少date
关键字。第二个日期原本是正确的,但似乎已被编辑,所以现在您有两个错误。
另外varchar
和char
列应该是varchar2
(Oracle 中的标准字符串类型)。
【参考方案1】:
这里最简单的做法是使用 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 标准,在该标准下,NULL
值和空字符串将不同(VARCHAR2
它们将始终是相同的)。 IOW,Oracle 中 VARCHAR
值的行为可以改变。
【讨论】:
我复制了您的查询,现在我得到 ORA-01438:值大于此列允许的指定精度 密码太大。您在创建表格时指定了 5 位精度 - 六位数字 (403001
) 将不起作用。抱歉,我之前没有发现。
如果对您有帮助,请接受/支持我的回答。【参考方案2】:
似乎当你用
查询时select * from nls_session_parameters p where p.parameter = 'NLS_DATE_FORMAT';
您不会从错误ORA-01843
的结果中得到YYYY-MM-DD
或YYYY-DD-MM
。
此问题是由于为日期列 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')
代表 Join_Date
【讨论】:
以上是关于sql 查询 ORA-01843的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 SQL 查询中输入 0 到 11 之间的月份时出现 oracle 错误 ORA-01843