无法运行的update问题解析(r5笔记第57天)

今天有个同事向我反馈一个问题,说是客户在部署他们提供的一个sql语句时,报了ora错误,想让我帮忙看看是什么原因。update sub_errs set error_status = 'READY_TO_RECYCLE' WHERE sub_appl_id = 3008 AND ENTITY_ID = 8336079 AND MASTER_TRX_ID = 202809364 and error_status = 'PENDING_DEPENDENCY' Error report - SQL Error: ORA-02290: ????????????????????????????? (APPO.SUB_ERRS_1CK) 首先看错误,还真接上小语种了,自己百度翻译了下,是违反约束条件的意思,也是开个玩笑,这个问题可以通过oerr来查看oracle的解释。02290, 00000, "check constraint (%s.%s) violated"// *Cause: The values being inserted do not satisfy the named check // constraint.// *Action: do not insert values that violate the constraint.可以看出应该是约束的地方出问题了,从约束的命名来看是以CK结尾,即check constraint。查看user_constraints中的search_condition字段,条件着实复杂,search_condition的条件如下:(depen_ind='S' AND error_status='PENDING_DEPENDENCY')OR (depen_ind='S' AND error_status='COMPLETED')OR (depen_ind='S' AND error_status='PURGED')OR depen_ind='B'OR depen_ind='N'即对于指定的字段error_status 需要满足上面的这些条件。这个check constraint算是一个比较复杂的约束了。error_status ,满足上面的条件才行。自己采用了exp的query选项导出数据,这样就会只导出19条数据,数据量就小多了,导入到一个测试环境中,就可以大胆的测试了。exp xxxxx/xxx file=a.dmp tables=sub_errs query=\" where sub_appl_id = 3008 AND ENTITY_ID = 8336079 \"我先根据id来抽取数据,抽取出19条数据来,然后在测试用户中使用对应的约束进行修改,看看问题是否会复现。导入数据很顺利,19条数据很快就导入了。imp xxxxx/xxxx file=a.dmp tables=sub_errs indexes=n grants=n ignore=Y constraints=n buffer=9102000 error_status = 'PENDING_DEPENDENCY' ((depen_ind='S' AND error_status='PENDING_DEPENDENCY')'READY_TO_RECYCLE',这个时候细看过滤条件中,是没有符合的error_status校验的,这个时候depen_ind还是S,就会出问题,READY_TO_RECYCLE',所以第1,2两个条件不会起作用,考虑第3,4个条件,就会发现没有匹配的情况。难怪会抛错。((depen_ind='S' AND error_status='PENDING_DEPENDENCY')OR (depen_ind='S' AND error_status='COMPLETED')OR (depen_ind='S' AND error_status='PURGED')OR depen_ind='B'OR depen_ind='N')update sub_errs set error_status = 'READY_TO_RECYCLE',depen_ind='N' WHERE sub_appl_id = 3008 AND ENTITY_ID = 8336079 AND MASTER_TRX_ID = 202809364 and error_status = 'PENDING_DEPENDENCY'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值