oracle - TO_char 将数字转换为字符串后返回斜杠值

标签 oracle to-char

我有一个数据库列 amount [Data type Number(32,12)]。当我在 amount 字段上使用 to_char 时我在输出中附加了一个斜杠值。

Screenshot

当我直接使用存储在金额字段中的值时,我得到了正确的值

从 dual 中选择 TO_Char(0.000000000099,'FM9999999999999999999999999999990.099999999999');

输出:- 0.000000000099

最佳答案

您的表中似乎有损坏的数据。这就引出了一些问题,包括它是如何到达那里的,以及您能做些什么?

损坏的数字(或 date )值通常来自 OCI 程序,但有一些错误报告表明 imp 已知会导致损坏。支持说明 1007641.6 中记录了内部表示,但我发现在重新创建问题时更容易使用 this explanation 之类的东西,并且可以使用 PL/SQL block 代替 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 支持人员参与解决。

关于oracle - TO_char 将数字转换为字符串后返回斜杠值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273113/

相关文章:

ORACLE 数字转字符串

java - 如何用Java编写这个sql代码

oracle - 如何将带时区的字符串转换为日期

c++ - 从应用程序多次调用数据库过程是否会影响性能?

windows - tnsping ping 失败,即使我可以成功连接到数据库

mysql - 为什么我们要分配大小(如字符串数据类型中的 char(20) 或 varchar(20),而不是 SQL 中的 int 或 float 等数据类型)?

sql - 如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

c# - Entity Framework 连接到 Oracle : ODP for . NET "does not support time"

sql - ORACLE SQL CAST IN CASE 语句

sql - Oracle To_Char函数如果已经是字符串怎么处理