ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ora-01438诊断

ora-01438诊断

原创 Linux操作系统 作者:hrb_qiuyb 时间:2008-01-31 08:19:02 0 删除 编辑

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

产生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 acflg=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 acflg=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 acflg=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/9134/viewspace-166500/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2008-01-30

  • 博文量
    50
  • 访问量
    534876