ora-01438诊断

ora-014380, "value larger than specified precision allows for this column"这种报错很常见,大部时侯我们知道自己用的是什么语句,操作的是哪张表,但是哪个value引起的问题就很难判断了。[@more@]

产生ora-01438的原因也不少,比如表上的trigger的级联DML操作引起的,bug的原因,但最主要的原因还是插入的列值过来引起的。

按习惯上讲,我们可以做一个1438的errorstack的trace,不过一般这个trace很大且用处也不大,因为只能从中看到哪个表、哪个列、哪条语句引起的问题,但是不清楚哪个值引起的问题。

如下以一个测试来粗略说明一个发现原因的方法。

1、准备测试条件:

a、表T1

SQL> desc t1
Name Null? Type
------------------------------- -------- ------------
COL1 NUMBER(2)

b、一段批量插入的代码:

declare
i number;
begin
i:=0;
loop
i:=i+1;
exit when i>1000;
insert into t1 values (i);
end loop;
end;
/

2、测试开始,换个思路,以很出名的10046来做

SQL> alter session set events '10046 trace name context forever,level 5';

Session altered.

SQL> declare
i number;
begin
i:=0;
loop
i:=i+1;
exit when i>1000;
insert into t1 values (i);
end loop;
end; 2 3 4 5 6 7 8 9 10
11 /
declare
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
ORA-06512: at line 8

3、查找和分析生成的trace文件。

oracle@yang:/opt/oracle/admin/yang/udump> ls -lt
total 1432
-rw-r----- 1 oracle dba 64143 2006-05-20 18:54 yang_ora_24343.trc
-rw-r----- 1 oracle dba 1129743 2006-05-20 18:52 yang_ora_24253.trc
-rw-r--r-- 1 oracle dba 125 2006-05-20 18:18 afiedt.buf
-rw-r----- 1 oracle dba 1655 2006-05-09 23:29 yang_ora_1535.trc
-rw-r----- 1 oracle dba 1652 2006-05-09 23:28 yang_ora_1499.trc
-rw-r----- 1 oracle dba 116062 2006-04-28 20:39 yang_ora_3629.trc
-rw-r----- 1 oracle dba 118938 2006-04-28 20:37 yang_ora_3621.trc

oracle@yang:/opt/oracle/admin/yang/udump> vi yang_ora_24343.trc

如下为文件部分内容:
=============================================
EXEC #2:c=0,e=290,p=0,cr=0,cu=1,mis=0,r=1,dep=1,og=4,tim=1121213328526953
BINDS #2:
bind 0: dty=2 mxl=22(21) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=24
offset=0 bfp=0adc30f8 bln=22 avl=02 flg=09
value=98
EXEC #2:c=0,e=168,p=0,cr=0,cu=1,mis=0,r=1,dep=1,og=4,tim=1121213328527186
BINDS #2:
bind 0: dty=2 mxl=22(21) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=24
offset=0 bfp=0adc30f8 bln=22 avl=02 flg=09
value=99
EXEC #2:c=0,e=249,p=0,cr=0,cu=1,mis=0,r=1,dep=1,og=4,tim=1121213328527487
BINDS #2:
bind 0: dty=2 mxl=22(21) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=24
offset=0 abfp=0adc30f8 bln=22 avl=02 flg=09
value=100
EXEC #2:c=0,e=307,p=0,cr=0,cu=2,mis=0,r=0,dep=1,og=4,tim=1121213328527864
ERROR #2:err=1438 tim=3143095145
EXEC #1:c=0,e=34681,p=0,cr=3,cu=111,mis=0,r=0,dep=0,og=4,
tim=1121213328528064
ERROR #1:err=1438 tim=3143095145

我们找见err=1438这个部分,从这里向上看,可以见到,报错是因为value=100引起的,事实上再回头看看语句就更加清晰了,col1的定义width为2,即允许最大的也为99,100之上的当然不行了。

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

转载于:http://blog.itpub.net/717880/viewspace-836357/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值