Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

TO_char trả về giá trị dấu gạch chéo sau khi chuyển đổi một số thành Chuỗi

Có vẻ như bạn có dữ liệu bị hỏng trong bảng của mình. Điều này dẫn đến một số câu hỏi bao gồm làm thế nào nó đến được đó và bạn có thể làm gì với nó?

Lỗi số (hoặc ngày ) giá trị thường đến từ các chương trình OCI, nhưng có một số báo cáo lỗi đề xuất imp đã được biết là gây ra tham nhũng. Trình bày nội bộ được ghi lại trong ghi chú hỗ trợ 1007641.6, nhưng tôi tìm thấy một cái gì đó giống như giải thích này dễ làm việc hơn khi tạo lại sự cố và có thể sử dụng khối PL / SQL thay cho chương trình OCI.

Hai con số bạn đang gặp sự cố phải được trình bày nội bộ như sau:

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

Tôi chưa tìm ra chính xác những giá trị nào bạn có trong bảng của mình, nhưng tôi có thể hiển thị một kết quả tương tự:

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

Bán phá giá các giá trị cho thấy chúng trông hơi kỳ quặc:

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      

Chạy định dạng của bạn dựa trên đó cho kết quả tương tự:

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/

Nếu bạn có thể thêm dump() xuất dữ liệu của riêng bạn cho câu hỏi, sau đó tôi có thể xem liệu tôi có thể tạo lại chính xác các giá trị mà bạn đang thấy hay không.

Thông thường, có thể 'sửa' điều này bằng cách cập nhật dữ liệu, ví dụ:

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                                 

Tuy nhiên, bạn phải hỏi giá trị chính xác thực tế là bao nhiêu, giá trị này có thể trở lại như thế nào / tại sao / khi nó bị hỏng. Tôi sẽ rất cảnh giác khi chạm vào dữ liệu này nếu nó quan trọng và thực sự phải tiếp tục lời khuyên của @ DazzaL để nhờ Bộ phận hỗ trợ của Oracle tham gia giải quyết vấn đề.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 cách trả về hàng chỉ chứa ký tự chữ và số trong Oracle

  2. % Type có nghĩa là gì trong Oracle sql?

  3. Tìm tất cả các giá trị không phải dạng số trong một cột trong Oracle

  4. Thay đổi bảng, thêm cột / ORA-00984:cột không được phép ở đây PLSQL

  5. Nhận oracle.jdbc.driver.LogicalConnection, cần oracle.jdbc.OracleConnection