为什么我从此查询中获得无效的号码?

时间:2016-11-14 17:12:13

标签: sql oracle

我从此查询中收到“ORA-01722:无效号码”:

INSERT INTO OLD_MATCHES 
(ID, LEAGUE, WEEK, MATCH_DATE, HOME, AWAY, HOME_GOALS, AWAY_GOALS, HOME_BET, DRAW_BET, AWAY_BET, LEAGUE_SEASON)
VALUES
(OLD_MATCHES_SEQ.NEXTVAL, 240, 11, '26-02-2016', 'Chelsea', 'Arsenal', 3, 0, 2, 3, 4, 'Premier league');

我在Oracle常见问题解答中查看了这个解释:

尝试将字符串转换为数字时,会发生ORA-01722(“无效数字”)错误,并且无法将字符串转换为有效数字。有效数字包含数字'0'到'9',可能有一个小数点,字符串开头或结尾的符号(+或 - ),或'E'或'e'(如果它是浮点数)科学记数法中的点数)。禁止所有其他角色。

但这对我没有意义。

序列脚本:

CREATE SEQUENCE FOOTBALL.OLD_MATCHES_SEQ
  START WITH 12
  MAXVALUE 999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER;

表脚本:

CREATE TABLE FOOTBALL.OLD_MATCHES
(
  ID             NUMBER                         NOT NULL,
  LEAGUE         NUMBER,
  WEEK           NUMBER,
  MATCH_DATE     DATE,
  HOME           VARCHAR2(100 BYTE),
  AWAY           VARCHAR2(100 BYTE),
  HOME_GOALS     NUMBER,
  AWAY_GOALS     NUMBER,
  HOME_BET       NUMBER(5,2),
  AWAY_BET       NUMBER(5,2),
  DRAW_BET       NUMBER(5,2),
  LEAGUE_SEASON  NUMBER
)

2 个答案:

答案 0 :(得分:3)

这与序列无关。根据您的表定义,league_season是一个数字字段;您正在尝试插入字符串'Premier league'

您可能需要更改表格定义,但看起来您可能希望在那里有一个季节编号,可能是一年:

INSERT INTO OLD_MATCHES 
(ID, LEAGUE, WEEK, MATCH_DATE, HOME, AWAY, HOME_GOALS, AWAY_GOALS, 
  HOME_BET, DRAW_BET, AWAY_BET, LEAGUE_SEASON)
VALUES
(OLD_MATCHES_SEQ.NEXTVAL, 240, 11, TO_DATE('26-02-2016', 'DD-MM-YYYY'),
  'Chelsea', 'Arsenal', 3, 0, 2, 3, 4, 2015);

'26 -02-2016'也不是日期,它是一个字符串。要么像date '2016-02-26'一样使用ANSI date literal,要么使用to_date()和我上面使用的合适格式掩码。不要依赖隐式转换和NLS设置。这不会导致此错误,但有一天会导致您出现问题。

答案 1 :(得分:2)

  

尝试将字符串转换为数字时,会发生ORA-01722("无效数字")错误,并且该字符串无法转换为有效数字。有效数字包含数字' 0'通过' 9',可能有一个小数点,在字符串的开头或结尾有一个符号(+或 - ),或者一个' E'或者' e' (如果它是科学记数法中的浮点数)。禁止所有其他角色。

您需要将OLD_MATCHES.LEAGUE_SEASON替换为Varchar2类型

或更改您在LEAGUE_SEASON

插入号码的查询
INSERT INTO OLD_MATCHES 
(ID, LEAGUE, WEEK, MATCH_DATE, HOME, AWAY, HOME_GOALS, AWAY_GOALS, HOME_BET, DRAW_BET, AWAY_BET, LEAGUE_SEASON)
VALUES
(OLD_MATCHES_SEQ.NEXTVAL, 240, 11, '26-02-2016', 'Chelsea', 'Arsenal', 3, 0, 2, 3, 4, 1);