sql >> Database >  >> RDS >> Oracle

TO_char geeft slash-waarde terug na het converteren van een getal naar String

Het lijkt erop dat u beschadigde gegevens in uw tabel hebt. Wat leidt tot een paar vragen, waaronder hoe is het daar gekomen en wat kun je eraan doen?

Corrupt numeriek (of datum ) waarden komen vaak van OCI-programma's, maar er zijn enkele bugrapporten die suggereren dat imp bekend is dat het corruptie veroorzaakt. De interne weergave is gedocumenteerd in ondersteuningsnota 1007641.6, maar ik vind zoiets als deze uitleg gemakkelijker om mee te werken bij het opnieuw creëren van problemen, en het gebruik van een PL/SQL-blok is mogelijk in plaats van een OCI-programma.

De twee nummers waarmee u problemen ondervindt, moeten intern als volgt worden weergegeven:

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

Ik weet niet precies welke waarden je in je tabel hebt, maar ik kan een soortgelijk resultaat laten zien:

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;
/

Door de waarden te dumpen, zien ze er een beetje vreemd uit:

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      

Als je je opmaak daar tegenaan zet, krijg je vergelijkbare resultaten:

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/

Als je de dump() . kunt toevoegen uitvoer voor uw eigen gegevens naar de vraag, dan kan ik kijken of ik precies de waarden kan recreëren die u ziet.

Anekdotisch is het misschien mogelijk om dit te 'corrigeren' door de gegevens bij te werken, bijvoorbeeld:

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                                 

U moet zich echter afvragen wat de werkelijke juiste waarde is, wat waarschijnlijk terugkomt op hoe/waarom/wanneer deze is beschadigd. Ik zou erg op mijn hoede zijn om deze gegevens aan te raken als het überhaupt belangrijk is, en zou echt moet het advies van @DazzaL volgen om Oracle Support erbij te betrekken om het op te lossen.




  1. JPA's Map<KEY, VALUE>-query door JPQL is mislukt

  2. Kan niet meerdere aangepaste db-tabellen maken bij activering van wp-plug-in

  3. Wachtwoordverificatie mislukt met complex wachtwoord

  4. Kolomwijzigingen detecteren in een postgres-updatetrigger