Number(p,s)的认识....
1、number(p,s)
整数位<=p-s,精确到小数点后s位,并四舍五入。
若s为负数,则精确到小数点前s位,并四舍五入。
整数位<=p-s,精确到小数点后s位,并四舍五入。
若s为负数,则精确到小数点前s位,并四舍五入。
2、如果p=0,比如 number(10) 此时插入数值0.5,小数点后一位四舍五入,实际存储值为1,请大家注意
3.这里p是精度, s是刻毒范围
精度是数值中所有数字位的个数, 而刻度范围是小数点右边的数字的个数
精度是数值中所有数字位的个数, 而刻度范围是小数点右边的数字的个数
4、Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as wzhu
SQL> create table tb_test(id number(5,2));
Table created
SQL> insert into tb_test values(234.45);
1 row inserted
SQL> insert into tb_test values(1234.5);
insert into tb_test values(1234.5)
ORA-01438: value larger than specified precision allows for this column
/*ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度 */
ORA-01438: 值大于此列指定的允许精确度 */
4.1、number(5,2) 表未小数点右边保留 2 位, 小数点左边是 5-2=3 位
1234是小数点左边有4位, 所以报错了.
1234是小数点左边有4位, 所以报错了.
4.2、number(5,2)对1234.5来说就是右边保留两位小数,应该就是1234.50了,有效位数是6,大于5,所以报错
5. 精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
对如果s>p,小数点右边至少有s-p个0填充。我还是没有理解,
例如:number(4,6),是s>p把,但是就是说保留六位小数,不够就会在右边补0,这样总长度就一定会超过4了报错啊?
对如果s>p,小数点右边至少有s-p个0填充。我还是没有理解,
例如:number(4,6),是s>p把,但是就是说保留六位小数,不够就会在右边补0,这样总长度就一定会超过4了报错啊?
5.1、declare
v_number number(4,7);
begin
v_number :=123.45;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
这是我的测试代码,都是报错
ORA-06502: PL/SQL: numeric or value error: number precision too large
v_number number(4,7);
begin
v_number :=123.45;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
这是我的测试代码,都是报错
ORA-06502: PL/SQL: numeric or value error: number precision too large
5.2、declare
v_number number(4,2);
begin
v_number:=123;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
Output: ORA-06502: PL/SQL: numeric or value error: number precision too large
5.3 declare
v_number number(4,2);
begin
v_number:=12;
dbms_output.put_line(v_number);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
output: 12
由5.2 和 5.3 比较可以看出,number(p,s) 的结构是这样,P 为number 的总位数,S包含于P,属于小数点后面精确位数,即5.2 的输出形式为: 123.00 ,一共为 5位,超出了所定义的决位数number(4,2) 中的4,故报错; 5.3 的输入应为:12:00 没有超出,所以正常.