当前位置:操作系统 > Unix/Linux >>

ORA-01438处理方法

ORA-01438处理方法
 
解决思路:
 
(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
 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,