这是我的桌子
CREATE TABLE acctmanager
(
amid CHAR(4),
amfirst VARCHAR2(12) NOT NULL,
amlast VARCHAR2(12) NOT NULL,
amedate DATE DEFAULT SYSDATE,
amsal NUMBER(8,2),
amcomm NUMBER(7,2) DEFAULT 0,
region CHAR(2),
CONSTRAINT acctmanager2_amid_pk PRIMARY KEY (amid)
CONSTRAINT acctmanager2_region_ck
CHECK (region IN ('N', 'NW', 'NE, 'S', 'SE', 'SW', 'W', 'E'))
);
我正在尝试使用以下命令将第一个客户经理数据插入表 acctmanager
INSERT INTO acctmanager
VALUES ('T500', 'NICK', 'TAYLOR', '05-SEP-09', 42000, 3500, 'NE');
'05-SEP-09'
不是 DATE
;它是一个看起来像日期的字符串文字。
Oracle 将尽力提供帮助,并尝试将您的字符串隐式转换为日期,并且您的查询将有效地变为:
INSERT INTO acctmanager
VALUES (
'T500',
'NICK',
'TAYLOR',
TO_DATE(
'05-SEP-09',
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
),
42000,
3500,
'NE'
);
但是,如果
NLS_DATE_FORMAT
会话参数与您的字符串文字不匹配,那么它将失败并显示错误:
ORA-01861: literal does not match format string
要修复它,您可以:
使用日期文字:
INSERT INTO acctmanager
VALUES ('T500', 'NICK', 'TAYLOR', DATE '2009-09-05', 42000, 3500, 'NE');
显式转换日期并指定格式(和语言):
INSERT INTO acctmanager
VALUES (
'T500',
'NICK',
'TAYLOR',
TO_DATE('05-SEP-09', 'DD-MON'RR', 'NLS_DATE_LANGUAGE=English'),
42000,
3500,
'NE'
);
更改
NLS_DATE_FORMAT
:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';
但是,这被认为是不好的做法,因为您仍然依赖隐式转换,最好明确您正在使用的格式。