日期:2014-05-16  浏览次数:20552 次

ORA-01438处理方法

解决思路:

(1)跟踪执行插入的SQL/存储过程,找到罪魁祸首的行,修改后再次插入。

(2)最简单的办法就是增加目的字段的精度。

 

其他参考链接:

http://www.itpub.net/thread-956435-1-1.html

http://www.eygle.com/archives/2009/07/errorstack_ora_01438.html

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

由于定位不到具体的表以及具体的字段,需要跟踪错误

1、首先进行建立表

SQL> create table t (many number(4,2));

Table created

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

2、然后进行试验插入

SQL> insert into t values(1000000);

错误:

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 tony.t values(100000000);

错误:

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

5、在后台系统

[oracle@localhost udump]$ pwd

/home/oracle/admin/ORCL/udump

[oracle@localhost udump]$ ls

ORCL_ora_5035.trc

还可以通过SQL脚本查找生成的trace文件:

SELECT a.VALUE || b.symbol || c.instance_name || '_ora_' || d.spid || '.trc'
          trace_file
  FROM (SELECT VALUE
          FROM v$parameter
         WHERE name = 'user_dump_dest') a,
       (SELECT SUBSTR (VALUE, -6, 1) symbol
          FROM v$parameter
         WHERE name = 'user_dump_dest') b,
       (SELECT instance_name FROM v$instance) c,
       (SELECT spid
          FROM v$session s, v$process p, v$mystat m
         WHERE s.paddr = p.addr AND s.sid = m.sid AND m.statistic# = 0) d

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

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

6、查看TRACE文件

[oracle@localhost udump]$ more ORCL_ora_5035.trc

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

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

Current SQL statement for this session:

insert into tony.t

values(100000000)

顺利找到语句.

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

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

System altered

 

附件:Table 2-2 Storage of Scale and Precision

Actual Data

Specified As

Stored As

123.89

NUMBER

123.89

123.89

NUMBER(3)

124

123.89

NUMBER(