Oracle
 sql >> Baza danych >  >> RDS >> Oracle

TO_char zwraca wartość ukośnika po konwersji liczby na String

Wygląda na to, że masz uszkodzone dane w swojej tabeli. Prowadzi to do kilku pytań, w tym jak to się tam dostało i co możesz z tym zrobić?

Uszkodzona liczba (lub data ) wartości często pochodzą z programów OCI, ale istnieją raporty o błędach, które sugerują imp wiadomo, że powoduje korupcję. Wewnętrzna reprezentacja jest udokumentowana w nocie pomocy 1007641.6, ale znajduję coś takiego jak to wyjaśnienie łatwiej pracować podczas odtwarzania problemów, a użycie bloku PL/SQL jest możliwe zamiast programu OCI.

Dwie liczby, z którymi masz problem, powinny być reprezentowane wewnętrznie w ten sposób:

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

Nie wiem dokładnie, jakie wartości masz w tabeli, ale mogę pokazać podobny wynik:

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

Zrzucenie wartości pokazuje, że wyglądają nieco dziwnie:

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      

Porównywanie formatowania daje podobne wyniki:

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/

Jeśli możesz dodać dump() wyprowadzanie własnych danych do pytania, a następnie mogę sprawdzić, czy mogę odtworzyć dokładnie te wartości, które widzisz.

Anegdotycznie możliwe jest „poprawienie” tego, aktualizując dane, np.:

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                                 

Musisz jednak zapytać, jaka jest rzeczywista poprawna wartość, która prawdopodobnie odnosi się do tego, jak/dlaczego/kiedy została uszkodzona. Byłbym bardzo ostrożny, jeśli chodzi o dotykanie tych danych, jeśli są one w ogóle ważne, i naprawdę muszę poprzeć radę @DazzaL, aby zaangażować Oracle Support w rozwiązanie tego problemu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw do z CTE

  2. Czy Oracle TDE może chronić dane przed DBA?

  3. dodaj przecinek (,) w Oracle

  4. Czy istnieje sposób na uzyskanie numeru wiersza w Mysql, takiego jak rownum w Oracle?

  5. Jaka jest domyślna precyzja i skala liczby w Oracle?