表alter table 添加字段后,使用PLSQL dblink插入报错:ORA-00913值过多

问题描述:

  1. 数据库A版本:11.2.0.4
  2. 数据库B版本:11.2.0.1
  3. 数据库A上有连接到数据库B的dblink,名称:Hebdb
  4. 数据库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库实施删除,手动重建工作,重建之后发现问题得到解决。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值