ITPub博客

首页 > 数据库 > Oracle > 再次探讨number(p,s)(转)

再次探讨number(p,s)(转)

原创 Oracle 作者:rainytag 时间:2007-07-02 22:03:23 0 删除 编辑

上次探讨了常见的s的情况,这种基本上很好理解!其中p表示该number的总长度,s为小数位。如果s为负数,则会取相应位数的取整。例如,如果number(4,-2),则数字1234的存储值为1200。关于这点在此就不多谈了!

下面来谈谈少见的p的情况。在这种情况下precision用来指定小数点之后的最大有效数字位数。当然不包括小数点后紧接着的0的个数。例如:

SQL> conn test/test@report

已连接。

SQL> create table test1(t1 number(4,5),t2 number(3,6),t3 number(2,4));

表已创建。

SQL> insert into test1(t1) values(0.123);

insert into test1(t1) values(0.123) *

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(0.1234);

insert into test1(t1) values(0.1234)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(1.1234);

insert into test1(t1) values(1.1234)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(1.0234);

insert into test1(t1) values(1.0234)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

以上这几种情况下,为什么会报错,答案将在后面揭晓!

SQL> insert into test1(t1) values(0.0234);

已创建 1 行。

SQL> insert into test1(t1) values(0.02341);

已创建 1 行。

SQL> insert into test1(t1) values(0.023412);

已创建 1 行。

SQL> select t1 from test1;

T1

----------

.0234

.02341

.02341

此处说明了,在p这种情况下,p是用来控制保存最大有效数字位的。而s是用来干什么的呢?下面用例子来说明:

SQL> insert into test1(t1) values(0.023411);

已创建 1 行。

SQL> insert into test1(t1) values(0.023418);

已创建 1 行。

SQL> select t1 from test1;

T1

----------

.0234

.02341

.02341

.02341

.02342

这就说明了,此种情况下的s是用来限制小数点后数字的位数的【当然也就包括小数点后紧接的0】。

回到上面insert时为什么会报错的问题分析?当在p这种情况下,插入的数据必须是小数,而且是符合一定规则的小数,先看看以下测试:

SQL> insert into test1(t1) values(1);

insert into test1(t1) values(1)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(10);

insert into test1(t1) values(10)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(10.1);

insert into test1(t1) values(10.1)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(10.01)

insert into test1(t1) values(10.01)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

所以只能用来存放大于0小于1的小数。

再来看看下面的测试:

SQL> insert into test1(t1) values(0.1);

insert into test1(t1) values(0.1)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t1) values(0.01);

已创建 1 行。

SQL> insert into test1(t1) values(0.012);

已创建 1 行。

根据上面的3个insert可以看出,是不是插入的小数必须是小数点后第一位是0呢?接着看以下的test:

SQL> insert into test1(t2) values(0.012);

insert into test1(t2) values(0.012)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t2) values(0.0012);

insert into test1(t2) values(0.0012)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

为什么此时还会报错呢?

其实小数点后面必须的0的数目取决于(s-p)的值,就是说此种情况下小数点后紧接着的0的数目至少有s-p个,不然不能正常插入。

SQL> insert into test1(t2) values(0.00012);

已创建 1 行。

SQL> insert into test1(t3) values(0.012);

insert into test1(t3) values(0.012)

*

ERROR 位于第 1 行:

ORA-01438: 值大于此列指定的允许精确度

SQL> insert into test1(t3) values(0.0012);

已创建 1 行。

总结:在p这种情况下

1、 p用来指定小数点之后的最大有效数字位数。当然不包括小数点后紧接着的0的个数。

2、 只能用来存放大于0小于1的小数。

3、 s是用来限制小数点后数字的位数的【当然也就包括小数点后紧接的0】。

4、 小数点后面必须的0的数目取决于(s-p)的值,就是说此种情况下小数点后紧接着的0的数目至少有s-p个,不然无法正常插入。

以上说法,如有不妥,请务必指出!

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9650775/viewspace-923321/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-01

  • 博文量
    652
  • 访问量
    2207531