日期:2014-05-16 浏览次数:20552 次
解决思路:
(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(
|