EBS_DBA_问题:关于ORA-01438: value larger than specified precision allowed for this column

Posted BIT10-DBA&DEV

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EBS_DBA_问题:关于ORA-01438: value larger than specified precision allowed for this column相关的知识,希望对你有一定的参考价值。

 

问题模拟:

1、创建表和PL/SQL函数

 
create table dh_t (id number(2,1),name varchar2(200));
create or replace procedure p_dh1 as
 v_id number :=1234335;
 v_name varchar2(200) :=oradh;
begin
--just for errorstack test
insert into dh_t values (v_id,v_name);
commit;
end;
/
create or replace procedure p_dh2 as
 v_cnt number;
begin
----just for errorstack test
select count(*) into v_cnt from dh_t;
 dbms_output.put_line(the dh_t count is ||v_cnt);
 p_dh1;
end;
/

2、进行errorstack跟踪

 
SQL*Plus: Release 11.2.0.1.0 Production on Tue Jul 1 11:15:52 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
SQL> set linesize 200 pagesize 999
SQL> col tracefile format a100
SQL> select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));

SPID TRACEFILE
--------------- --------------------------------------------------------------------------------------------------
32882                    /u01/DEV/db/tech_st/11.2.0/admin/DEV_erp03/diag/rdbms/dev/DEV/trace/DEV_ora_32882.trc

SQL> alter session set events=1438 trace name errorstack forever,level 3;
Session altered.
SQL> exec p_dh2;
BEGIN p_dh2; END;

*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
ORA-06512: at "DBMON.P_DH1", line 6
ORA-06512: at "DBMON.P_DH2", line 7
ORA-06512: at line 1

[[email protected] ~]$ ls -ltr /u01/DEV/db/tech_st/11.2.0/admin/DEV_erp03/diag/rdbms/dev/DEV/trace/DEV_ora_32882.trc


--下载/u01/DEV/db/tech_st/11.2.0/admin/DEV_erp03/diag/rdbms/dev/DEV/trace/DEV_ora_32882.trc

打开:

 

Trace file /u01/DEV/db/tech_st/11.2.0/admin/DEV_erp03/diag/rdbms/dev/DEV/trace/DEV_ora_32882.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/DEV/db/tech_st/11.2.0
System name:    Linux
Node name:    erp03.lasland.com
Release:    2.6.39-300.26.1.el5uek
Version:    #1 SMP Thu Jan 3 18:31:38 PST 2013
Machine:    x86_64
Instance name: DEV
Redo thread mounted by this instance: 1
Oracle process number: 275
Unix process pid: 32882, image: oracle@erp03.lasland.com (TNS V1-V3)


*** 2016-08-31 14:22:47.187
*** SESSION ID:(2947.4137) 2016-08-31 14:22:47.187
*** CLIENT ID:() 2016-08-31 14:22:47.187
*** SERVICE NAME:(SYS$USERS) 2016-08-31 14:22:47.187
*** MODULE NAME:(sqlplus@erp03.lasland.com (TNS V1-V3)) 2016-08-31 14:22:47.187
*** ACTION NAME:() 2016-08-31 14:22:47.187
 
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-01438: value larger than specified precision allowed for this column
----- Current SQL Statement for this session (sql_id=b8n03s73k7d39) -----
INSERT INTO DH_T VALUES (:B2 ,:B1 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x127f2f128         6  procedure SYS.P_DH1
0x103e87f48         7  procedure SYS.P_DH2
0x15bebdba8         1  anonymous block

可以看到执行情况 是先执行1再执行procedure SYS.P_DH2的第七行 然后执行procedure SYS.P_DH1的第六行,发生了问题.

然后结合INSERT INTO DH_T VALUES (:B2 ,:B1 ) 继续深入看看什么情况导致的.

查看相关代码\\

 

 select line, text from dba_source where owner = SYS and name = P_DH1 order by line asc;

 

查看第六行:

insert into dh_t values (v_id,v_name);

查看一下他的变量是什么:

打开跟踪文件,通常第一步做的是搜索第一个"Session Cursor Dump",当搜索它的时候,将看到如下的输出:

----- Session Cursor Dump -----
Current cursor: 3, pgadep=1

 

搜索Cursor#3

Cursor#3(0x7feee6691d50) state=BOUND curiob=0x7feee657b2e0
 curflg=cd fl2=0 par=(nil) ses=0x1559b0c00
----- Dump Cursor sql_id=b8n03s73k7d39 xsc=0x7feee657b2e0 cur=0x7feee6691d50 -----

往下拉 看到相关的情况:

 

 

----- Bind Info (kkscoacd) -----
 Bind#0
  oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
  oacflg=13 fl2=206001 frm=00 csi=00 siz=24 off=0
  kxsbbbfp=7feee66ce2f0  bln=22  avl=05  flg=09
  value=1234335
 Bind#1
  oacdty=01 mxl=2000(200) mxlc=00 mal=00 scl=00 pre=00
  oacflg=13 fl2=206001 frm=01 csi=871 siz=2000 off=0
  kxsbbbfp=7feee66ce330  bln=2000  avl=05  flg=09
  value="oradh"
 Frames pfr 0x7feee657b258 siz=3472 efr 0x7feee657b178 siz=3416
 Cursor frame dump
  enxt: 3.0x00000550  enxt: 2.0x00000040  enxt: 1.0x000007c8
  pnxt: 1.0x00000038
 kxscphp=0x7feee651d4e8 siz=984 inu=584 nps=360
 kxscbhp=0x7feee651d608 siz=984 inu=152 nps=0
 kxscwhp=0x7feee64fd608 siz=4056 inu=56 nps=0
Starting SQL statement dump
SQL Information
user_id=0 user_name=SYS module=sqlplus@erp03.lasland.com (TNS V1-V3) action=
sql_id=b8n03s73k7d39 plan_hash_value=0 problem_type=0
----- Current SQL Statement for this session (sql_id=b8n03s73k7d39) -----
INSERT INTO DH_T VALUES (:B2 ,:B1 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x127f2f128         6  procedure SYS.P_DH1
0x103e87f48         7  procedure SYS.P_DH2
0x15bebdba8         1  anonymous block
sql_text_length=36
sql=INSERT INTO DH_T VALUES (:B2 ,:B1 )

再来看看一个cursor用了多少UGA

 

 

 

 

 

以上是关于EBS_DBA_问题:关于ORA-01438: value larger than specified precision allowed for this column的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01438 错误

捕获导致 ORA-01438 的列:值大于此列允许的指定精度

ORA-01438: 大于指定精度的值允许此列 - 我如何获得它所指的列?

插入 3 时出现“ORA-01438: 值大于此列允许的指定精度”

插入 3 时出现“ORA-01438: 值大于此列允许的指定精度”

错误:“ORA-01438:值大于此列允许的指定精度”故障因素:“空”详细信息:org.kxml2.kdom.Node@99c0b9c