ORA-01722:to_number中的数字无效

时间:2018-08-20 06:42:53

标签: sql oracle

我正在尝试通过发票号连接两个表中的数据,

LOC         NOT NULL VARCHAR2(40)
INV_ORG            NUMBER

就像这样,它工作正常:

SELECT     oh.inv_org,e.loc
FROM       headers oh, sites e
WHERE
AND e.location = TO_CHAR(oh.inv_org);

但是当我尝试将char转换为数字时,我得到了 ORA-01722:无效号码

SELECT     oh.inv_org, e.loc
FROM       headers oh, sites e
WHERE
AND to_number(e.loc) = oh.inv_org;
  

错误报告

     

ORA-01722:无效的数字

我不知道为什么,因为在选择时,转换也可以正常工作

INV_ORG  110992
LOC  110992
OH.INV_ORG-TO_NUMBER(E.LOC) 0

3 个答案:

答案 0 :(得分:2)

检查您的数据,可能e.loc中的值无法转换为数字。

顺便说一句,下面的选择给出了ORA-01722:

SELECT to_number('test') FROM dual

答案 1 :(得分:2)

如果这不起作用:

SELECT     oh.inv_org, e.loc
FROM       headers oh, sites e
WHERE
AND to_number(e.loc) = oh.inv_org;

表示有e.loc个值不能转换为数字(例如字母)。因此,您应该使用可行的查询(因为将oh.inv_org转换为字符串没有问题)

SELECT     oh.inv_org,e.loc
FROM       headers oh, sites e
WHERE
AND e.location = TO_CHAR(oh.inv_org);

但是,整个故事意味着当前数据模型的设置不正确。您要加入可能的列需要用于某种外键约束,即

  • 应该有一个包含位置的表
  • 它应该有一个主键,并且
  • 应同时从标题和站点表中引用主键列。

如果是这种情况,那么您现在就不会有问题。

P.S。哦,是的-并且,尝试切换到ANSI连接。无法解决您当前的问题,但将来会有所回报。

SELECT oh.inv_org,e.loc
FROM   headers oh join sites e on e.location = to_char(oh.inv_org);

答案 2 :(得分:0)

尝试一下:to_number函数需要2个参数

SELECT     oh.inv_org, e.loc
FROM       headers oh, sites e
WHERE
 to_number(e.loc,'9999999') = oh.inv_org;