为啥我从这个查询中得到无效号码?

Posted

技术标签:

【中文标题】为啥我从这个查询中得到无效号码?【英文标题】:Why do I get invalid number from this query?为什么我从这个查询中得到无效号码? 【发布时间】:2016-11-14 17:12:12 【问题描述】:

我从这个查询中得到“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
)

【问题讨论】:

另外,'26-02-2016' 是在 sql 中格式化日期的一种非常奇怪的方式。 “20160226”是仅日期值的标准,“2016-02-26 00:00:00.000”是包含时间分量的标准。 【参考方案1】:

这与顺序无关。根据您的表定义,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 设置。这不会导致此错误,但它会在某一天给您带来问题。

【讨论】:

【参考方案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);

【讨论】:

以上是关于为啥我从这个查询中得到无效号码?的主要内容,如果未能解决你的问题,请参考以下文章

如何用我从文本框中得到的号码更改证书的名称

EXCEL中如何点击运单号码就可以直接得到查询结果?

请问怎么查询一个手机号码的区号?

Oracle中实现sql查询得到连续号码段

手机取证为啥要获取Iccid

js为啥我的focus获得焦点无效