Oracle
 sql >> база данни >  >> RDS >> Oracle

TO_char връща стойност на наклонена черта след преобразуване на число в String

Изглежда, че имате повредени данни в таблицата си. Което води до няколко въпроса, включително как се е стигнало до там и какво можете да направите по въпроса?

Повредена цифра (или дата ) стойностите често идват от 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, за да разреши проблема.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. session/entitymanager е затворен

  2. ORA-00900:грешка в невалиден SQL оператор? Какво не е наред с моя sql?

  3. Oracle, PDO_OCI срещу OCI8

  4. Име на SQL колона, същото като име на променлива PL/SQL - Как може да се направи това в оператор select?

  5. Не можа да се създаде String Oracle ARRAY от varchar2 в JDBC