ORA-01861:文字与格式字符串不匹配,如何修复此错误?

问题描述 投票:0回答:1

这是我的桌子

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');
sql database oracle11g
1个回答
0
投票

'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

要修复它,您可以:

  1. 使用日期文字:

    INSERT INTO acctmanager
    VALUES ('T500', 'NICK', 'TAYLOR', DATE '2009-09-05', 42000, 3500, 'NE');
    
  2. 显式转换日期并指定格式(和语言):

    INSERT INTO acctmanager
    VALUES (
      'T500',
      'NICK',
      'TAYLOR',
      TO_DATE('05-SEP-09', 'DD-MON'RR', 'NLS_DATE_LANGUAGE=English'),
      42000,
      3500,
      'NE'
    );
    
  3. 更改

    NLS_DATE_FORMAT

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';
    

    但是,这被认为是不好的做法,因为您仍然依赖隐式转换,最好明确您正在使用的格式。

© www.soinside.com 2019 - 2024. All rights reserved.