oracle中number型字段长度、精度及实际存储状态测试(zt)

本文详细介绍了Oracle数据库中NUMBER类型的使用方法及其限制条件,通过多个案例展示了不同精度和标度设置下数值插入的具体行为。

工作中经常要遇到这种字段的处理情况,当然以前也见过大虾总结过。但是看了之后,又还给人家。是人家的终究还是人家的,需要自己亲自测试并总结才能变成自己的。

http://blog.chinaunix.net/u/22472/showart.php?id=258754


相关知识回顾:
有效数位:从左边第一个不为0的数算起,小数点和负号不计入有效位数。
number(p,s)
p:1~38
s:-84~127
p>0,对s分2种情况:
1. s>0
精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
2. s<0
精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|

案例测试:
desc">hongsy@test>desc hongsy;
名称 是否为空? 类型
----------------------------------------------------- -------- ------------
NUM1 NUMBER
NUM2 NUMBER(2)
NUM3 NUMBER(5,3)
NUM4 NUMBER(5,-2)
insert">hongsy@test>insert into hongsy(num1) values(1111111111);
已创建 1 行。
提交完成。
insert">hongsy@test>insert into hongsy(num2) values(11);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num2) values(111);
insert into hongsy(num2) values(111)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度

insert">hongsy@test>insert into hongsy(num2) values(-11);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num2) values(-111);
insert into hongsy(num2) values(-111)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度

insert">hongsy@test>insert into hongsy(num2) values(-11.1);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num2) values(-11.1111);
已创建 1 行。
提交完成。
select">hongsy@test>select num2 from hongsy;
NUM2
----------

11
-11
-11
-11
已选择8行。
insert">hongsy@test>insert into hongsy(num3) values(111);
insert into hongsy(num3) values(111)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度

insert">hongsy@test>insert into hongsy(num3) values(11);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num3) values(-11);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num3) values(-111);
insert into hongsy(num3) values(-111)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度

insert">hongsy@test>insert into hongsy(num3) values(11.111);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num3) values(11.1111);
已创建 1 行。
提交完成。
select">hongsy@test>select num3 from hongsy;
NUM3
----------

11
-11
11.111
11.111
已选择12行。
insert">hongsy@test>insert into hongsy(num4) values(1111);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num4) values(111111);
已创建 1 行。
insert">hongsy@test>insert into hongsy(num4) values(11111111);
insert into hongsy(num4) values(11111111)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
提交完成。
select">hongsy@test>select num4 from hongsy;
NUM4
----------

1100
111100
已选择14行。
insert">hongsy@test>insert into hongsy(num4) values(1111111);
已创建 1 行。
提交完成。
select">hongsy@test>select num4 from hongsy;
NUM4
----------

1100
111100
1111100
已选择15行。
create">hongsy@test>create table hongsy1 (num1 number(39));
create table hongsy1 (num1 number(39))
*
ERROR 位于第 1 行:
ORA-01727: 数字精度说明符超出范围(1 到 38)

create">hongsy@test>create table hongsy1 (num1 number(38,128));
create table hongsy1 (num1 number(38,128))
*
ERROR 位于第 1 行:
ORA-01728: 数字标度说明符超出范围(-84 到 127)

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

转载于:http://blog.itpub.net/35489/viewspace-84718/

SELECT PRO_GROUPID, PRO_GROUPDESC, PROVINCECOMSNAME, YEAR_VALUEPREM_ZT, LY_VALUEPREM_ZT, YEAR_VALUEPREM_PLAN_ZT, CHANGE_RATE_ZT, ACHIEVEMENT_RATE_ZT, YEAR_VALUEPREM_YX, LY_VALUEPREM_YX, YEAR_VALUEPREM_PLAN_YX, CHANGE_RATE_YX, ACHIEVEMENT_RATE_YX, YEAR_VALUEPREM_SZ, LY_VALUEPREM_SZ, YEAR_VALUEPREM_PLAN_SZ, CHANGE_RATE_SZ, ACHIEVEMENT_RATE_SZ, YEAR_VALUEPREM_YDCF, LY_VALUEPREM_YDCF, YEAR_VALUEPREM_PLAN_YDCF, CHANGE_RATE_YDCF, ACHIEVEMENT_RATE_YDCF, YEAR_VALUEPREM_YD, LY_VALUEPREM_YD, YEAR_VALUEPREM_PLAN_YD, CHANGE_RATE_YD, ACHIEVEMENT_RATE_YD, YEAR_VALUEPREM_CF, LY_VALUEPREM_CF, YEAR_VALUEPREM_PLAN_CF, CHANGE_RATE_CF, ACHIEVEMENT_RATE_CF, YEAR_VALUEPREM_GY, LY_VALUEPREM_GY, YEAR_VALUEPREM_PLAN_GY, CHANGE_RATE_GY, ACHIEVEMENT_RATE_GY, LOADDATE, SOURCE_TABLE FROM ( SELECT a.DATEID, a.PRO_GROUPID, pg.PRO_GROUPDESC, pc.PROVINCECOMSNAME, a.YEAR_VALUEPREM_ZT, a.LY_VALUEPREM_ZT, a.YEAR_VALUEPREM_PLAN_ZT, 1 AS ACHIEVEMENT_RATE_ZT, 1 AS CHANGE_RATE_ZT, a.YEAR_VALUEPREM_YX, a.LY_VALUEPREM_YX, a.YEAR_VALUEPREM_PLAN_YX, 1 AS ACHIEVEMENT_RATE_YX, 1 AS CHANGE_RATE_YX, a.YEAR_VALUEPREM_SZ, a.LY_VALUEPREM_SZ, a.YEAR_VALUEPREM_PLAN_SZ, 1 AS ACHIEVEMENT_RATE_SZ, 1 AS CHANGE_RATE_SZ, a.YEAR_VALUEPREM_YDCF, a.LY_VALUEPREM_YDCF, a.YEAR_VALUEPREM_PLAN_YDCF, 1 AS ACHIEVEMENT_RATE_YDCF, 1 AS CHANGE_RATE_YDCF, a.YEAR_VALUEPREM_YD, a.LY_VALUEPREM_YD, a.YEAR_VALUEPREM_PLAN_YD, 1 AS ACHIEVEMENT_RATE_YD, 1 AS CHANGE_RATE_YD, a.YEAR_VALUEPREM_CF, a.LY_VALUEPREM_CF, a.YEAR_VALUEPREM_PLAN_CF, 1 AS ACHIEVEMENT_RATE_CF, 1 AS CHANGE_RATE_CF, a.YEAR_VALUEPREM_GY, a.LY_VALUEPREM_GY, a.YEAR_VALUEPREM_PLAN_GY, 1 AS ACHIEVEMENT_RATE_GY, 1 AS CHANGE_RATE_GY, a.LOADDATE, 'D006' AS SOURCE_TABLE FROM DMR_BD_A0101_D006 a LEFT JOIN D_PRO_GROUP pg ON a.PRO_GROUPID = pg.PRO_GROUPID LEFT JOIN D_PROVINCECOM pc ON a.PROVINCECOMCODE = pc.PROVINCECOMCODE UNION ALL SELECT b.DATEID, b.PRO_GROUPID, pg.PRO_GROUPDESC, pg.PRO_GROUPDESC || '合计' AS PROVINCECOMSNAME, b.YEAR_VALUEPREM_ZT, b.LY_VALUEPREM_ZT, b.YEAR_VALUEPREM_PLAN_ZT, 1 AS ACHIEVEMENT_RATE_ZT, 1 AS CHANGE_RATE_ZT, b.YEAR_VALUEPREM_YX, b.LY_VALUEPREM_YX, b.YEAR_VALUEPREM_PLAN_YX, 1 AS ACHIEVEMENT_RATE_YX, 1 AS CHANGE_RATE_YX, b.YEAR_VALUEPREM_SZ, b.LY_VALUEPREM_SZ, b.YEAR_VALUEPREM_PLAN_SZ, 1 AS ACHIEVEMENT_RATE_SZ, 1 AS CHANGE_RATE_SZ, b.YEAR_VALUEPREM_YDCF, b.LY_VALUEPREM_YDCF, b.YEAR_VALUEPREM_PLAN_YDCF, 1 AS ACHIEVEMENT_RATE_YDCF, 1 AS CHANGE_RATE_YDCF, b.YEAR_VALUEPREM_YD, b.LY_VALUEPREM_YD, b.YEAR_VALUEPREM_PLAN_YD, 1 AS ACHIEVEMENT_RATE_YD, 1 AS CHANGE_RATE_YD, b.YEAR_VALUEPREM_CF, b.LY_VALUEPREM_CF, b.YEAR_VALUEPREM_PLAN_CF, 1 AS ACHIEVEMENT_RATE_CF, 1 AS CHANGE_RATE_CF, b.YEAR_VALUEPREM_GY, b.LY_VALUEPREM_GY, b.YEAR_VALUEPREM_PLAN_GY, 1 AS ACHIEVEMENT_RATE_GY, 1 AS CHANGE_RATE_GY, b.LOADDATE, 'D006_1' AS SOURCE_TABLE FROM DMR_BD_A0101_D006_1 b LEFT JOIN D_PRO_GROUP pg ON b.PRO_GROUPID = pg.PRO_GROUPID UNION ALL SELECT c.DATEID, 0 AS PRO_GROUPID, '系统合计' AS PRO_GROUPDESC, '系统合计' AS PROVINCECOMSNAME, c.YEAR_VALUEPREM_ZT, c.LY_VALUEPREM_ZT, c.YEAR_VALUEPREM_PLAN_ZT, 1 AS ACHIEVEMENT_RATE_ZT, 1 AS CHANGE_RATE_ZT, c.YEAR_VALUEPREM_YX, c.LY_VALUEPREM_YX, c.YEAR_VALUEPREM_PLAN_YX, 1 AS ACHIEVEMENT_RATE_YX, 1 AS CHANGE_RATE_YX, c.YEAR_VALUEPREM_SZ, c.LY_VALUEPREM_SZ, c.YEAR_VALUEPREM_PLAN_SZ, 1 AS ACHIEVEMENT_RATE_SZ, 1 AS CHANGE_RATE_SZ, c.YEAR_VALUEPREM_YDCF, c.LY_VALUEPREM_YDCF, c.YEAR_VALUEPREM_PLAN_YDCF, 1 AS ACHIEVEMENT_RATE_YDCF, 1 AS CHANGE_RATE_YDCF, c.YEAR_VALUEPREM_YD, c.LY_VALUEPREM_YD, c.YEAR_VALUEPREM_PLAN_YD, 1 AS ACHIEVEMENT_RATE_YD, 1 AS CHANGE_RATE_YD, c.YEAR_VALUEPREM_CF, c.LY_VALUEPREM_CF, c.YEAR_VALUEPREM_PLAN_CF, 1 AS ACHIEVEMENT_RATE_CF, 1 AS CHANGE_RATE_CF, c.YEAR_VALUEPREM_GY, c.LY_VALUEPREM_GY, c.YEAR_VALUEPREM_PLAN_GY, 1 AS ACHIEVEMENT_RATE_GY, 1 AS CHANGE_RATE_GY, c.LOADDATE, 'D006_2' AS SOURCE_TABLE FROM DMR_BD_A0101_D006_2 c ) alls ORDER BY pro_groupID, SOURCE_TABLE, YEAR_VALUEPREM_ZT;这是我的sql YEAR_VALUEPREM_ZT字段排序未生效数据库中字段NUMBER
09-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值