我用一个过程从一个远方数据库用for loop ...end loop隐式游标处理数据,insert到办公室另一个数据的一个表里,处理到16万多行时总是出错,最后找到问题:
---------------
系统信息:
ORA-01406: 读取的列值被截断
在执行S_DBA01_GCYC过程时,执行到JH=STT763RQ=12-3月 -05时:
原因:
在宿主语言程序中,FETCH(取值)操作被迫截断一字符串。程序缓冲区对此列来说不够大,不能放下全部的字符串。游标(cursor)返回的值为+3
措施:
增大列缓冲区以放下最大的列值。或者进行适当的处理
----------------------------------
虽然我不能查看远方数据库的表的结构,但是select出出问题的那行数据,一个字段一个字段的和本地数据库表的字段对比,没有发现字段太小的情况,经过查找资料,发现很可能是oracle的一个补丁,在这个连接有说明:
http://www.dbasupport.com/forums/archive/index.php/t-15697.html问题是,我用的是Oracle9i,不知道到底改打523214 和893259 哪个不顶,液找不到布丁的下载地址,
还有就是,改在我办公室的oracle上打,还是在远方数据库上打?

解决方案 »

  1.   

    我也遇到同样错误啊!
    操作环境是:
    也是用一个过程通过databaselink 从远程oracle9i数据库用for loop ...end loop隐式游标处理longrow类型数据,insert到本地oracle10g的一个表里的blob字段中,处理到20多万条记录时报了ora-01406的错误,但是把此条记录跳过后还能再转一部分数据,然后又报错了!后来,等下班后9i上的系统业务办理停止了,又跑了一遍过程,结果转到70多万又出错了,又跳着转,但是这样太费劲了,要跳好多次,几十万的数据这样处理肯定不行,于是我狠心一个月一个月的跳着转(这样有点很不负责任,但是每办法了,施工现场没办法上网求助!),最后竟然从06年4月到12月的数据里有些转不进去,从07年至今的数据还好只有一条转不进去,跳过了他!还有公司同时说也遇到类似问题,猜测是不是oracle9i到10g的问题,但是我在现场试过了,把存储过程和database link 迁移到9i的数据库上,还是不行!现在我想求助高手来帮忙了!
      

  2.   

    database link在处理特殊数据类型的时候的确有这样的问题,我想可能是处理这些数据类型的时候,开了一个缓冲区,如果数据量大的情况下造成缓冲区溢出,导致这样的错误.个人的猜测,没有事实根据.
    :)
      

  3.   

    今天也遇到,估计是9I的一个bug