我附上了我正在处理的表和插入语句。
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.
答案 0 :(得分:5)
让我们从逻辑上看这个。错误消息是"无效的数字"。甲骨文对你说"我期待一个号码,但你给了我一些不是数字"。
查看表SQL,可以看到该表有两列,其类型为数字类型(实际为INTEGER
)。这些是DRIVER_ID
和PHONE
。 (其他专栏现在不重要......因为他们不会期望一个数字作为价值。)
现在查看插入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