现有两张表Table1, Table2. Table1中的四个字段 A B C D,都是Number型(都是整数),且均为主键。
现在的需求是把四个字段连接起来(A||B||C||D) 生成一个新的Number型的字段并插入Table2 的列E(主键)。现在的问题是,可以连接得到数据:
40022039500182051
40022039500182052
40022039500182053
40022039500182054
40022039500182055
40022039500182056
40022039500182057
40022039500182058但等到插入E列时,却都成了40022039500182000。
也就是说18位的数字只能精确到15位。最后几位的都被截取掉了。
我知道如果把E的数据类型改为VARCHAR2可以解决。
请问大家,如果改动数据类型,会有什么影响吗?Table2原来是有数据的。
除以上方法有什么解决方案吗?
期待大家的宝贵建议!

解决方案 »

  1.   

    --oracle的number类型精度很高,出现上述情况只是你的显示问题
    --并不是数据库中数据精度丢失
    --当然,如果只是用作编号,最好使用VARCHAR2型,
    --如果原来列上没有数据,可以直接修改数据类型,
    --atler table table_name modify(e varchar2);
    --如果原来列上有数据,则需要先清空数据然后修改类型。SQL> create table an(a number);表已创建。SQL> insert into an values(40022039500182051);已创建 1 行。SQL> set numwidth 20;
    SQL> select * from an;                   A
    --------------------
       40022039500182051SQL> 
      

  2.   

    直接改成varchar类型就好了,,没太大影响。
      

  3.   

    你看一下你的表的某列字段类型属性是不是number(13,5)?? 意思是说13位整数和五位小数。
    你使用integer类型的试一下。
      

  4.   


    SQL> create table t(a number(20));
    SQL> insert into t values(40022039500182051);
    SQL> select * from t;
                        A
    ---------------------
      4.00220395001821E16
    SQL> select to_char(a) from t;
     
    TO_CHAR(A)
    ----------------------------------------
    40022039500182051--to_char()函数将数字转换为字符串之后还可以将转换后的字符数字当做数字一样进行计算,
    --所以不会有什么影响
    SQL> select to_char(1220)||'数字' from dual;--作为字符串使用
     
    TO_CHAR(1220)||'数字'
    ---------------------
    1220数字
     
    SQL> select to_char(1220)-1220 from dual;--作为数字使用
     
      TO_CHAR(1220)-1220
    --------------------
                       0
    --不过,应用中最好少这样做
      

  5.   

    谢谢大家!反复测试过了,不是Oracle的问题,Oracle可以存储这样长的数据,是我们的数据集成接口的问题.