Изглежда, че имате повредени данни в таблицата си. Което води до няколко въпроса, включително как се е стигнало до там и какво можете да направите по въпроса?
Повредена цифра (или дата
) стойностите често идват от OCI програми, но има някои доклади за грешки, които предполагат imp
е известно, че причинява корупция. Вътрешното представяне е документирано в бележка за поддръжка 1007641.6, но намирам нещо като това обяснение по-лесен за работа при пресъздаване на проблеми и използването на 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, за да разреши проблема.