我有一个数据库列amount [Data type Number(32,12)]
。当我在to_char
字段上使用amount
时,我会在输出中附加一个斜杠值。
当我直接使用存储在金额字段中的值时,我得到了正确的值
select TO_Char(0.000000000099,'FM99999999999999999999999999999990.099999999999') from dual;
输出: -
0.000000000099
答案 0 :(得分:2)
您的表格中的数据似乎已损坏。这导致了一些问题,包括它是如何实现的,以及你能做些什么呢?
损坏的数字(或date)值通常来自OCI程序,但有一些错误报告表明imp
已知会导致损坏。内部表示记录在支持说明1007641.6中,但我发现在重新创建问题时更容易使用this explanation之类的东西,并且可以使用PL / SQL块代替OCI程序。
您遇到问题的两个数字应该在内部表示如下:
select dump(0.000000000099, 16) as d1,
dump(0.000000001680, 16) as d2
from dual;
D1 D2
------------------ ---------------------
Typ=2 Len=2: bb,64 Typ=2 Len=3: bc,11,51
我还没弄清楚你桌子上究竟有什么价值,但我可以看到类似的结果:
create table t42 (amount number(32,12)) nologging;
declare
n number;
begin
dbms_stats.convert_raw_value('bb65', n);
insert into t42 (amount) values (n);
dbms_stats.convert_raw_value('bc100000', n);
insert into t42 (amount) values (n);
end;
/
倾倒值显示它们看起来有点奇怪:
column d1 format a25
column d2 format a25
select amount, dump(amount) d1, dump(amount, 16) d2
from t42;
AMOUNT D1 D2
--------------------------- ------------------------- -------------------------
0.00000000010 Typ=2 Len=2: 187,101 Typ=2 Len=2: bb,65
0.000000001499 Typ=2 Len=3: 188,16,0 Typ=2 Len=3: bc,10,0
针对该格式运行格式会产生类似的结果:
select amount as actual__________amount,
TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
as amount__________Changed
from t42
order by amount;
ACTUAL__________AMOUNT AMOUNT__________CHANGED
--------------------------- ----------------------------------------------
0.00000000010 ##############################################
0.000000001499 0.00000000150/
如果您可以将自己数据的dump()
输出添加到问题中,那么我可以看看是否可以重新创建您正在看到的值。
有趣的是,有可能通过更新数据来“纠正”这一点,例如:
update t42 set amount = amount * 1;
select amount, dump(amount) d1, dump(amount, 16) d2
from t42;
AMOUNT D1 D2
--------------------------- ------------------------- -------------------------
0.0000000001 Typ=2 Len=2: 188,2 Typ=2 Len=2: bc,2
0.000000001499 Typ=2 Len=3: 188,15,100 Typ=2 Len=3: bc,f,64
select amount as actual__________amount,
TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
as amount__________Changed
from t42
order by amount;
ACTUAL__________AMOUNT AMOUNT__________CHANGED
--------------------------- ----------------------------------------------
0.0000000001 0.0000000001
0.000000001499 0.000000001499
但是,您必须询问实际的正确值是什么,这可能会回到它/如何/何时被破坏。如果这些数据非常重要,我会非常谨慎地接触这些数据,并且真的必须得到@DazzaL的建议才能让Oracle支持人员对其进行整理。