天天看点

ORA-01438处理方法 value larger than specified precision allowed for this column

http://ora-01438.ora-code.com/

ORA-01438:

value larger than specified precision allowed for this column
Cause: When inserting or updating records, a numeric value was entered that exceeded the precision defined for the column.
Action: Enter a value that complies with the numeric column's precision, or use the MODIFY option with the ALTER TABLE command to expand the precision.

for example, use round to control the precision

 http://space.itpub.net/7728585/viewspace-592633

ORA-01438: value larger than specified precision allowed for this column

由于定位不到具体的表以及具体的字段,同事问我们是否可以跟踪一下错误,由于小弟入行时间短,还没有遇到过这样的问题,然后BAIDU了一下,然后搜索到了这样一篇文章http://www.itpub.net/thread-956435-1-1.html,

当然我不是IMP 出错的但是原理一样然后做了试验如下

1、首先进行建立表

SQL> create table test5

y*T;] O6dg0  2  (many number(10,2));

Table created

精度为10,刻度为2 也就说整数位数最多为8,小数位数会占去2位

2、然后进行试验插入

SQL> insert into test5ITPUB个人空间*`[email protected] F

  2  values(1000000000);

insert into test5ITPUB个人空间(H*nzn0_v

values(1000000000)

ORA-01438: value larger than specified precision allowed for this column

出现错误

3、进行系统设置改变进行TRACE

alter system set events='1438 trace name Errorstack forever,level 10';

4、新开一个会话(我觉得这样的改变只对随后的会话起作用,并不会对设置前的会话起作用)进行模拟错误。

SQL> insert into pp.test5ITPUB个人空间)n-nGn(F2E7|"n'e

  2  values(100000000000);

insert into pp.test5ITPUB个人空间sRBi._d)KM

values(100000000000)

ORA-01438: value larger than specified precision allowed for this column

5、在后台系统

[[email protected] udump]$ pwd

fr)}FM0/home/oracle/admin/GELCPRO/udump

d*X]xY WYr0[[email protected] udump]$ lsITPUB个人空间{.e b$h)t8a i9wy

gelcpro_ora_7008.trc

找到了TRACE文件,当然我是先清空了所有以前的TRACE如果很多的话可以使用

ls  -lrt 进行排序找最近的TRC文件。

6、查看TRACE文件

[[email protected] udump]$ more gelcpro_ora_7008.trcITPUB个人空间s*h'Lvh_he4F

/home/oracle/admin/GELCPRO/udump/gelcpro_ora_7008.trc

ix(e4`.x/e F/{0Oracle Database10g Enterprise Edition Release 10.2.0.1.0 - ProductionITPUB个人空间Bm[5jn^

With the Partitioning, OLAP and Data Mining options

?H1},q/k!I?-L L0ORACLE_HOME = /home/oracle/product/10.2.0/db_1

0r$g g!z g PWM0System name:    LinuxITPUB个人空间4v#xh_6\

Node name:      localhost.localdomain

7LW+p aGbh;G6H0Release:        2.6.9-42.ELsmp

PC-B0O,m6e0Version:        #1 SMP Wed Jul 12 23:27:17 EDT 2006

+O9mqhs&doQ^C0Machine:        i686

c#tK D-kG;Fri F0Instance name: GELCPROITPUB个人空间'N-eOL_4^/H Q:^]

Redo thread mounted by this instance: 1ITPUB个人空间q1w;nb"T

Oracle process number: 28

%e7a`9BL0Unix process pid: 7008, image:[email protected]

*** ACTION NAME:(Command Window - New) 2009-04-28 05:57:59.492

!^3_WT*x Ze}0*** MODULE NAME:(PL/SQL Developer) 2009-04-28 05:57:59.492ITPUB个人空间;\5\B"heb vm [ z

*** SERVICE NAME:(GELCPRO) 2009-04-28 05:57:59.492ITPUB个人空间Rt_[]'@@,~

*** SESSION ID:(136.199) 2009-04-28 05:57:59.492ITPUB个人空间k G$| X)vn`L6^

*** 2009-04-28 05:57:59.492

9x+d7NN6}3nV0ksedmp: internal or fatal error

(Tde5Z8fU0ORA-01438: value larger than specified precision allowed for this columnITPUB个人空间 B\ b-l_U s

Current SQL statement for this session:

7e8p4mE K @B9]0insert into pp.test5

m xN ODrbH2E0values(100000000000)

jc0Dx5OVB0----- Call Stack Trace -----

.......

文件很多内容,我所用到的只有前面几行。

ORA-01438: value larger than specified precision allowed for this column

1r8m+J4N{ KyR0Current SQL statement for this session:

A;OV;|4G{0insert into pp.test5

ga3uZ,d0values(100000000000)

顺利找到语句.

这里顺便贴出关于

alter system set events='1438 trace name Errorstack forever,level 10';相关的文档

alter system set events相关知识:

格式:alter system|session set events ‘[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : …….’

通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set events来设置多个事件。

格式说明:eventnumber指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用。

immediate关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与eventnumber、forever关键字同用。

trace name是关键字。

eventname指事件名称(见后面),即要进行dump的实际结构名。若eventname为context,则指根据内部事件号进行跟踪。

forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。

level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。

levelnumber表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。

1、buffers事件:dump SGA缓冲区中的db buffer结构

alter session set events ‘immediate trace name buffers level 1′; –表示dump缓冲区的头部。

2、blockdump事件:dump数据文件、索引文件、回滚段文件结构

alter session set events ‘immediate trace name blockdump level 66666′; –表示dump块地址为6666的数据块。

在Oracle 8以后该命令已改为:

alter system dump datafile 11 block 9; –表示dump数据文件号为11中的第9个数据块。

3、controlf事件:dump控制文件结构

alter session set events ‘immediate trace name controlf level 10′; –表示dump控制文件的所有内容。

4、locks事件:dump LCK进程的锁信息

alter session set events ‘immediate trace name locks level 5′;

5、redohdr事件:dump redo日志的头部信息

alter session set events ‘immediate trace name redohdr level 1′; –表示dump redo日志头部的控制文件项。

alter session set events ‘immediate trace name redohdr level 2′; –表示dump redo日志的通用文件头。

alter session set events ‘immediate trace name redohdr level 10′; –表示dump redo日志的完整文件头。

注意:redo日志的内容dump可以采用下面的语句:

alter system dump logfile ‘logfilename’;

6、loghist事件:dump控制文件中的日志历史项

alter session set events ‘immediate trace name loghist level 1′; –表示只dump最早和最迟的日志历史项。

levelnumber大于等于2时,表示2的levelnumber次方个日志历史项。

alter session set events ‘immediate trace name loghist level 4′; –表示dump 16个日志历史项。

7、file_hdrs事件:dump所有数据文件的头部信息

alter session set events ‘immediate trace name file_hdrs level 1′; –表示dump所有数据文件头部的控制文件项。

alter session set events ‘immediate trace name file_hdrs level 2′; –表示dump所有数据文件的通用文件头。

alter session set events ‘immediate trace name file_hdrs level 10′; –表示dump所有数据文件的完整文件头。

8、errorstack事件:dump错误栈信息,通常Oracle发生错误时前台进程将得到一条错误信息,但某些情况下得不到错误信息,可以采用这种方式得到Oracle错误。

alter session set events ‘604 trace name errorstack forever’; –表示当出现604错误时,dump错误栈和进程栈。

9、systemstate事件:dump所有系统状态和进程状态

alter session set events ‘immediate trace name systemstate level 10′; –表示dump所有系统状态和进程状态。

10、coalesec事件:dump指定表空间中的自由区间

levelnumber以十六进制表示时,两个高位字节表示自由区间数目,两个低位字节表示表空间号,如0×00050000表示dump系统表空间中的5个自由区间,转换成十进制就是327680,即:

alter session set events ‘immediate trace name coalesec level 327680′;

11、processsate事件:dump进程状态

alter session set events ‘immediate trace name processsate level 10′;

12、library_cache事件:dump library cache信息

alter session set events ‘immediate trace name library_cache level 10′;

13、heapdump事件:dump PGA、SGA、UGA中的信息

alter session set events ‘immediate trace name heapdump level 1′;

14、row_cache事件:dump数据字典缓冲区中的信息

alter session set events ‘immediate trace name row_cache level 1′;

最后加一句如果想DISABLE掉可以使用

SQL>  alter system set events='1438 trace name Errorstack off';

System altered

OK 就到这里