ORA-01438解决方法

2014-11-24 17:47:06 · 作者: · 浏览: 0

解决思路:


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


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



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


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、在后台系统


/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


相关阅读: