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(6,2)

123.89

123.89

NUMBER(6,1)

123.9

123.89

NUMBER(3)

exceeds precision

123.89

NUMBER(4,2)

exceeds precision

123.89

NUMBER(6,-2)

100

.01234

NUMBER(4,5)

.01234

.00012

NUMBER(4,5)

.00012

.000127

NUMBER(4,5)

.00013

.0000012

NUMBER(2,7)

.0000012

.00000123

NUMBER(2,7)

.0000012

1.2e-4

NUMBER(2,5)

0.00012

1.2e-5

NUMBER(2,5)

0.00001

 

 

 

 

你可能感兴趣的:(oracle,trobleshooting)