sql 查询 ORA-01843

Posted

技术标签:

【中文标题】sql 查询 ORA-01843【英文标题】:sql query ORA-01843 【发布时间】:2018-04-21 17:28:18 【问题描述】:

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

【问题讨论】:

我收到错误 ORA-01843 not a valid month 我尝试插入 null 但不起作用我尝试使用 to_date('19900705','yyyymmdd') 但没有帮助 您的日期缺少 date 关键字。第二个日期原本是正确的,但似乎已被编辑,所以现在您有两个错误。 另外varcharchar 列应该是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-DDYYYY-DD-MM

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

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

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

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

【讨论】:

以上是关于sql 查询 ORA-01843的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 SQL 查询中输入 0 到 11 之间的月份时出现 oracle 错误 ORA-01843

ORA-01843: 无效的月份

SQL 错误:ORA-01843:不是有效月份

ORA-01843: 无效的月份 - 报告

ORA-01843 - 不是有效的月份 oracle SQL

ORA-01843: 无效的月份 -java 到 sql 日期转换