解决思路:
(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、在后台系统
[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
相关阅读:
SPFILE 错误导致数据库无法启动(ORA-01565)
ORA-01172、ORA-01151错误处理
ORA-00600 [2662]错误解决