使用SQL TRACE 排查ORA-06502: PL/SQL: numeric or value error 一解

四川行0728的外管作业报错,提示ORACLE错误
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1
一般这种错误都是由于数值型的字段插入非数值产生。排查当日数据,检查各数值字段中是否有非数值数据,或者空格。
耗费两个小时排查程序中所有的数值型字段的加工,却一无所获,所有数值型字段的数据都是有效数字。

排查无解,只能使用sql trace 跟踪程序的运行。

在PRO*c 程序中增加

execute immediate ‘alter session set events ”10046 trace name context forever,level 12”’;

(注意需要使用DBA用户授予ODSBDATA用户ALTER SESSION ‘的权限,否则会报权限不足)

重新编译后运行,等待程序报错后前往数据库主机取得trace文件。
(文件位置可以使用sql查询 select value from v$parameter where name=’user_dump_dest’ ,文件名为进程号)

检查trace文件 在FETCH #39游标时程序报了错误ERROR #1:err=6502,错误时的绑定变量值为‘6011’,
BINDS #39:
kkscoacd
Bind#0
  oacdty=01 mxl=32(05) mxlc=00 mal=00 scl=00 pre=00
  oacflg=13 fl2=206001 frm=01 csi=852 siz=32 off=0
  kxsbbbfp=800003f740020a00  bln=32  avl=04  flg=05
  value=”6011″
EXEC #39:c=0,e=120,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=19473437793620
WAIT #39: nam=’db file sequential read’ ela= 9689 file#=53 block#=340863 blocks=1 obj#=1133089 tim=19473437803598
FETCH #39:c=0,e=10066,p=1,cr=2,cu=0,mis=0,r=1,dep=1,og=1,tim=19473437803713
ERROR #1:err=6502 tim=1994080031

从错误点往上寻找CURSOR #39 。得到游标的语句。
PARSING IN CURSOR #39 len=85 dep=1 uid=68 oct=3 lid=68 tim=19473437608957 hv=2456379465 ad=’3d82aa78′
SELECT  C_TRANS_CODE, D_TRANS_CODE FROM BM_SAFE_SPE_DSCRP_COD_DIM WHERE DSCRP_COD=:1
END OF STMT
PARSE #39:c=0,e=397,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=19473437608950

程序中源码的程序为
EXECUTE IMMEDIATE   ‘SELECT  C_TRANS_CODE, D_TRANS_CODE FROM BM_SAFE_SPE_DSCRP_COD_DIM WHERE DSCRP_COD=:1 ‘
                              INTO  C_TRANS_CODE, D_TRANS_CODE
                              USING FDETAIL.SA_DSCRP_COD;

由于已知发生错误的绑定变量值为6011,手工执行sql

SELECT  C_TRANS_CODE, D_TRANS_CODE FROM BM_SAFE_SPE_DSCRP_COD_DIM WHERE DSCRP_COD=’6011′;

C_TRAN D_TRAN
—— ——
902010

返回值为902010,以及空值。根据trace文件的提示。游标的EXEC没有问题。错误发生在fetch过程中。即发生在将sql结果赋值给程序变量的过程中

检查程序中的变量定义。发现问题。定义长度为4位,而实际为6位。

  C_TRANS_CODE VARCHAR2(4);
  D_TRANS_CODE VARCHAR2(4);

修改长度后重新编译运行,作业成功。

询问四川行。原来昨日下午他们有应业务要求,将自动补录的配置表中的4位交易码改为6位。

ORA-06502: PL/SQL: numeric or value error

虽然numberic error 占大多数,但是像这个例子一样value error 也是其中的一部分。

2010 第一篇

新年有点不顺利..

整个春节都在下雨,结果都没出去玩

移动硬盘在拷东西的时候摔到地上,,结果插上以后居然不转了..

装修的时候搞得乱糟糟,,天天接到物业和邻居的投诉电话..现在都要绕道走..好避开物业..

装修真是一个累人的事情.要恶补装修知识,要东奔西跑看价格.做比较, 还要当民工搬东西.

口袋囊中羞涩,包工包料的话就不会如此的麻烦…

买房

看了半年.终于在一片降价声中在最高位买了房子,走入了房奴一族.
也说不上是啥心情..

买房历程

很多人买房的时候  首付啊 按揭啊都算得恰到好处
但是在看房当中发现   买的起的房子都不太满意  满意的房子又买不起
最后就变成不断的自我妥协  
首付不行再跟别人借一点 买个房子不容易 一辈子的事  当然要买满意的了
房子就越卖越大  
我最早是打算买60万以内的   后来看房看到了85万的房子
那个时候 我发现自己头脑有点发热了
把自己冷静下来   我差点上了中介的当

因为每套房子都不可能十全十美的
什么样的价位就有什么样的房子
中介经常会有 这样的话语:
其实呢,这套房子挺不错,可能就是。。。(列举房子某一缺点)
我这边还有一套,会比这个好一点,就是价格稍微高一点
满看一下啦   比较比较  不买也没关系

我想说的是
买房本身就是个自我妥协的过程
不单单在价钱上  
你可能本来想买在思明的  最后跑湖里了
本来想要个朝南的  后来想想朝北也无所谓
有些东西可以妥协  有些东西要有坚持
个人认为  买房前一定要对自己的经济能力有个客观的评估
存款多少  月入多少  公积金多少  固定支出多少  医保社保情况  
有无小孩   保险情况
有无购车计划 等等
完了再确定自己的首付  按揭能力
这些考虑清楚了   再去关注房价的高低
前者  称一称自己   几斤几两就知道
后者 除非是上帝  谁也不知道哪是高哪是低
把握好我们所能把握的东西  再去预判不可预知的东西
这样我们这个购房的风险才会降到最低
千万不要打肿脸去充胖子  超出自己的经济能力去买大房
这样不但会严重影响自己的生活质量
房价的任何波动也会影响自己的心情的