问题:每次在定义column或者 variable的时候,如果严格定义的number类型的precision,隔或长或
短的一段时间总会发现 把Numberic error的错误。那么
①怎么避免这种情况的发生?
②不指定precision可不可以?
③可以的话,那可行不可行,会不会占用空间,导致存储上的浪费?
④至少varchar2类型 是必须指定precision的。

 

对于②提出的方法进行简单测试:

SQL> create table test_default (
  2  code number
  3  )
  4  /

表已创建。

SQL> insert into test_default
  2  values(123.89);

已创建 1 行。

SQL> insert into test_default
  2  values(0);

已创建 1 行。

SQL> insert into test_default
  2  values(1);

已创建 1 行。

SQL> insert into test_default
  2  values(2);

已创建 1 行。

SQL> insert into test_default
  2  values(25);

已创建 1 行。

SQL> insert into test_default
  2  values(4100)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(132004078);

已创建 1 行。

SQL> insert into test_default
  2  values(2.01);

已创建 1 行。

SQL> insert into test_default
  2  values(0.3)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(0.00000125)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(115.200003)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(-1);

已创建 1 行。

SQL> insert into test_default
  2  values(-5)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(-20032)
  3  /

已创建 1 行。

SQL> insert into test_default
  2  values(-234.432)
  3  /

已创建 1 行。

SQL> commit;

提交完成。
 insert into test_default
values(10000)
/
insert into test_default
values(100000)
/
insert into test_default
values(1000000)
/
insert into test_default
values(-123456.78901)
/
insert into test_default
values(-123456.789)


/
insert into test_default
values(100000000000000000000000000000000000)

SQL> col code format 999999999

 

SQL> select code,dump(code) from test_default
  2  /

 

       CODE DUMP(CODE)
---------- --------------------------------------------------------------------------------
         1 Typ=2 Len=2: 193,2
        25 Typ=2 Len=2: 193,26
      2.01 Typ=2 Len=3: 193,3,2
    100000 Typ=2 Len=2: 195,11
   1000000 Typ=2 Len=2: 196,2
    123.89 Typ=2 Len=4: 194,2,24,90
 132004078 Typ=2 Len=6: 197,2,33,1,41,79
   1.25E-6 Typ=2 Len=3: 190,2,26
     10000 Typ=2 Len=2: 195,2
         2 Typ=2 Len=2: 193,3
  -234.432 Typ=2 Len=6: 61,99,67,58,81,102
      4100 Typ=2 Len=2: 194,42
       0.3 Typ=2 Len=2: 192,31
-123456.78 Typ=2 Len=7: 60,89,67,45,23,11,102
      1E35 Typ=2 Len=2: 210,11
-123456.78 Typ=2 Len=8: 60,89,67,45,23,11,91,102
115.200003 Typ=2 Len=6: 194,2,16,21,1,4
        -1 Typ=2 Len=3: 62,100,102
    -20032 Typ=2 Len=5: 60,99,101,69,102
        -5 Typ=2 Len=3: 62,96,102
 
      CODE DUMP(CODE)
---------- --------------------------------------------------------------------------------
         0 Typ=2 Len=1: 128

 

SQL> select code,dump(code,16) from test_default;
 
      CODE DUMP(CODE,16)
---------- --------------------------------------------------------------------------------
         1 Typ=2 Len=2: c1,2
        25 Typ=2 Len=2: c1,1a
      2.01 Typ=2 Len=3: c1,3,2
    100000 Typ=2 Len=2: c3,b
   1000000 Typ=2 Len=2: c4,2
    123.89 Typ=2 Len=4: c2,2,18,5a
 132004078 Typ=2 Len=6: c5,2,21,1,29,4f
   1.25E-6 Typ=2 Len=3: be,2,1a
     10000 Typ=2 Len=2: c3,2
         2 Typ=2 Len=2: c1,3
  -234.432 Typ=2 Len=6: 3d,63,43,3a,51,66
      4100 Typ=2 Len=2: c2,2a
       0.3 Typ=2 Len=2: c0,1f
-123456.78 Typ=2 Len=7: 3c,59,43,2d,17,b,66
      1E35 Typ=2 Len=2: d2,b
-123456.78 Typ=2 Len=8: 3c,59,43,2d,17,b,5b,66
115.200003 Typ=2 Len=6: c2,2,10,15,1,4
        -1 Typ=2 Len=3: 3e,64,66
    -20032 Typ=2 Len=5: 3c,63,65,45,66
        -5 Typ=2 Len=3: 3e,60,66
 
      CODE DUMP(CODE,16)
---------- --------------------------------------------------------------------------------
         0 Typ=2 Len=1: 80

③结论:

  首先必要的说明关于dump函数的返回格式类似:

  类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]
typ=2标识的是number类型
len是占用字节数
后面是每个字节上存储的东西,每个字节上是符号位、小数点位还是咋存的,然后得出来值,这个有点费脑细胞@@ 先放那。具体可以看看这个
http://www.eygle.com/archives/2005/12/how_oracle_stor.html
 
---------------------------
从输出的结果可以看到:
可以这样定义,没有问题;
不会有空间占用的问题,每个数占用的空间和它本身的复杂度有关,并非数值越大占用的字节数就越多,是按需占用的,这点和varchar2类似。
 
 

 

posted on 2010-12-02 11:14  维也纳下午茶  阅读(499)  评论(0编辑  收藏  举报