qty
鉴于它确实是一个字段,我可以看到您可以获得所显示结果的唯一方法number
是它是否包含损坏的数据(这就是为什么人们对该假设持怀疑态度的原因)。我还假设您的客户正在用前导零格式化值,但没有强制尾随零,这通常不会出现;你当然可以用 强制它to_char(.0008, '0.00000')
,但你似乎没有这样做;仍然,前导零让我想知道。
无论如何,为了证明损坏,您可以通过 PL/SQL 将无效值强制输入字段 - 不要使用真实数据或您关心的表尝试此操作:
create table t42(qty number);
table T42 created.
declare
n number;
begin
dbms_stats.convert_raw_value('bf0901', n);
insert into t42 (qty) values (n);
end;
/
anonymous block completed
select qty from t42;
QTY
----------
.00080
select to_number(qty) from t42;
Error starting at line : 12 in command -
select to_number(qty) from t42
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 - "invalid number"
请注意,普通查询按预期显示数字 - 尽管有一个尾随零,并且没有前导零 - 并通过to_number()
throws ORA-01722 运行它。除了前导零之外,这就是您所展示的。
它也失败了to_char()
,如您的问题标题所示:
select to_char(qty) from t42;
Error starting at line : 13 in command -
select to_char(qty) from t42
Error report -
SQL Error: ORA-01722: invalid number
...这是有道理的;你to_number()
正在做一个隐式转换,所以它真的是,我认为to_number(to_char(qty))
它是实际产生错误的隐式。to_char()
您的评论表明您有一个加载和删除数据的过程。看看它到底在做什么,以及它是否会引入腐败,将会很有趣。这种效果可以通过 OCI 实现,因为数据库会相信它传递的数据是有效的,就像上面的 PL/SQL 示例一样。有错误报告表明imp
也可能导致损坏。因此,加载过程的详细信息可能很重要,确切的数据库版本和平台也可能很重要。