Похоже, вы испортили данные в своей таблице. Что приводит к нескольким вопросам, в том числе как он туда попал и что вы можете с этим поделать?
Поврежденные числовые значения (или дата) часто поступают из программ OCI, но есть некоторые отчеты об ошибках, которые предполагают, что imp
, как известно, вызвать коррупцию. Внутреннее представление задокументировано в примечании службы поддержки 1007641.6, но я нашел что-то вроде этого объяснения с ним легче работать при воссоздании проблем, а вместо программы OCI можно использовать блок PL/SQL.
Два числа, с которыми у вас возникли проблемы, должны быть представлены внутренне следующим образом:
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, чтобы разобраться с этим.
person
Alex Poole
schedule
14.01.2013
select ascii(substr(to_char(your_column, '<format model>'), -1)) from your_table
? Если это числовое значение, оно должно быть в диапазоне 48-57. - person Ben   schedule 11.01.2013/
, поэтому вы добавляете один... - person Ben   schedule 11.01.2013WK_hold_trans_calculation
таблицей или представлением? Если это представление, основано ли оно на процедуре/функции? Похоже, что-то происходит под капотом, если это не ошибка SQL Developer, и похоже, что это уже исключено. Не уверен, какto_char
все равно попадет в представление... - person Alex Poole   schedule 11.01.2013create table foo (id number(32, 12)); insert into foo values (0.000000000099);
и запустите для нее тот же выбор? также у вас естьcursor_sharing
, установленный на аналогичный/принудительный или какие-либо нестандартные параметры? вероятно, лучше всего задействовать поддержку Oracle (здесь не воспроизводится на моем 11.2.0.2 db) - person DazzaL   schedule 11.01.2013select amount, dump(amount, 16)
для этих двух значений добавить результаты к вопросу? Они должны бытьbb,64
иbc,11,51
, но я подозреваю, что после них у них будет больше значений. Если они это сделают, это может быть воссоздано. - person Alex Poole   schedule 11.01.2013