问题描述:
- 数据库A版本:11.2.0.4
- 数据库B版本:11.2.0.1
- 数据库A上有连接到数据库B的dblink,名称:Hebdb
- 数据库A有一个存储过程,每天将表TB_GOS_PURCHASE_PURSTOCKOUTDET的数据插入到数据库B
在2018年10月21日,由于产品上线,对数据库A的表TB_GOS_PURCHASE_PURSTOCKOUTDET新增了两个字段:SALERETURNREASON VARCHAR2(500),SALERETURNREASONNAME VARCHAR2(500)。
这时A库到B库存储过程执行失败,报错ORA-00913值过多。
发现报错后在B库对表TB_GOS_PURCHASE_PURSTOCKOUTDET也新增了这两个字段,但是再次执行存储过程依然执行失败,报错ORA-00913值过多。
下述是报错的截图:
问题分析:
1,将报错的语句从存储过程中单独的提取出来,不使用PLSQL发现可以顺利执行,并未报错:
这里可以看到A库通过dblink向B库中插入报错。我们将B库该表插入到A库中是否也报错呢,因此又做了如下测试:
2,在A库中手动创建和B库表TB_GOS_PURCHASE_PURSTOCKOUTDET结构一样的表ZG_TEST,再通过dblink,将B库的数据插入到A库中。这个时候发现执行报错:ORA-00947没有足够的值。
但是将begin ..end去掉直接执行,可以顺利执行并未报错。
3,在begin和end中将列的字段全部列出的写法做插入:
begin
insert into zg_test
(col1, col2, ……, SALERETURNREASON, SALERETURNREASONNAME)
select (col1, col2, ……, SALERETURNREASON, SALERETURNREASONNAME)
from TB_GOS_PURCHASE_PURSTOCKOUTDET@Hebdb;
end;
结果报错找不到TB_GOS_PURCHASE_PURSTOCKOUTDET@Hebdb的字段 SALERETURNREASONNAME,去掉B库表的两个字段,在begin ..End中可以顺利的插入,这里未做记录)
4,通过dba_tab_columns视图对比,发现A库和B库列数目,字符类型等完全相同。B库中也存在新添加的两个列。 这个我们通过不用begin..end执行成功也能得到验证。
测试到这里我们就大概可以怀疑可能是触发到数据库某个bug,因此在mos上查看,果然发现了如下匹配的bug:
问题解决:
遗憾的是该文档并未提供解决方法,但是我们也能想到解决办法:在B库重建表TB_GOS_PURCHASE_PURSTOCKOUTDET。因为B库不是正产环境,数据也是根据A库得来的。因此直接在B库实施删除,手动重建工作,重建之后发现问题得到解决。