SQL错误:ORA-01722:无效的数字

时间:2015-11-28 02:19:45

标签: oracle

我附上了我正在处理的表和插入语句。

CREATE TABLE EMP (
        DRIVER_ID       INTEGER     NOT NULL
    , FNAME     VARCHAR(30) NOT NULL
    , LNAME     VARCHAR(30) NOT NULL
    , ADDRESS   VARCHAR(50) NOT NULL
    , SALARY    VARCHAR(50) NOT NULL
    , DOB       DATE            NOT NULL
    , SHIFTS    VARCHAR2(20)    NOT NULL
    , SSN       CHAR(11)    NOT NULL
    , PHONE         INTEGER         NOT NULL
    , HIRING_DATE   DATE            NOT NULL
    , EMAIL     VARCHAR2(50)    NOT NULL
);

当我运行此insert语句时:

INSERT INTO EMP (DRIVER_ID, FNAME, LNAME, ADDRESS, SALARY, DOB, SHIFTS, SSN, PHONE, HIRING_DATE, EMAIL) 
VALUES (SEQ_EMP.NEXTVAL,'Emma', 'Johnson', '123 Main Street', 'DIRECT DEPOSIT', '31 JANUARY,1988', 'MORNING', '579-45-6666', '410-555-1112', '16 DECEMBER,2013', 'ejohnson@fakemail.com');  

我收到此错误消息

SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

2 个答案:

答案 0 :(得分:5)

让我们从逻辑上看这个。错误消息是"无效的数字"。甲骨文对你说"我期待一个号码,但你给了我一些不是数字"。

查看表SQL,可以看到该表有两列,其类型为数字类型(实际为INTEGER)。这些是DRIVER_IDPHONE。 (其他专栏现在不重要......因为他们不会期望一个数字作为价值。)

现在查看插入SQL以及与这些列对应的值。

  • 插入DRIVER_ID列的值来自SEQ_EMP.NEXTVAL ...我假设其类型为INTEGER。这意味着,你不会从那里得到错误。

  • 插入PHONE列的值为'410-555-1112'。但是,嘿,这不是一个数字。它是一根绳子!除了(数学)数字之外,其中没有嵌入连字符!

简而言之,如果您要存储嵌入了-(或+或空格)字符的电话号码,则无法使用INTEGER作为列类型。

答案 1 :(得分:0)

在你的表中DDL更改

PHONE         INTEGER         NOT NULL

PHONE         CHAR(12)         NOT NULL

如前所述,用户Stephen C使用CHAR而不是INTEGER。

此外,这些DATE字段也必须转换为CHAR数据类型,或者您必须格式化INSERT以正确处理日期格式。那些字段是:

, DOB       DATE            NOT NULL
, HIRING_DATE   DATE            NOT NULL

如果您选择将列保留为DATE,那么在您的插入中使用(对于上述列)以下内容......

,to_date('31-JANUARY-1988','DD-MONTH-YYYY')
,to_date('16-DECEMBER-2013','DD-MONTH-YYYY')

上述内容不会为您提供完全您正在寻找的内容 - 例如16 DECEMBER,2013 - 但它可以使用连字符工作并格式化日期 - 例如16-DECEMBER-2013。如果您需要有关Oracle的to_date()函数的更多信息以获取格式和其他各种信息,请参阅Oracle文档或通过您喜欢的浏览器搜索“Oracle TO_DATE”。

HTH