加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

一个SQL语句引发的ORA-00600错误排查

发布时间:2021-01-08 19:28:23 所属栏目:安全 来源:网络整理
导读:《一个SQL语句引发的ORA-00600错误排查》要点: 本文介绍了一个SQL语句引发的ORA-00600错误排查,希望对您有用。如果有疑问,可以联系我们。 作者介绍 杨建荣 ,【DBAplus社群】联合发起人.现就职于搜狐畅游,Oracle ACE-A、YEP成员,超7年数据库开发和运维经验

在table_xx的地方加入子查询,可能会让我们在联想到一些语句中使用子查询的DML方式,但是在merge语句中,这个地方会有问题,所幸的是这个问题目前的测试没有发现对线上环境产生严重的影响,需要引以为戒,不过问题还不能这么轻易下结论,我们继续往下看.

5认知的反转

如果只是像上面那么想,充其量只是一个攻略,而且你对Merge印象会更加糟糕.

难道是Merge有什么特别之处吗,我们来看看Oracle的官方对于Merge语句的解释.可以看到merge into后面可以是table或者是view.

我在上面的测试使用的是子查询,那么试试view可不可行呢.

我们创建一个view.

create view test_view as select * from test_bug where object_type=’TABLE’;

我滴个神,这个问题确实就是这么任性,那么我们是不是可以得出一个结论,在merge into的后面只能使用table或者view,不能使用子查询呢,还是不要过早下结论.

6持续反转(二)

对于这个问题,我们也进行了小范围的讨论,兔子大师在看到我的这个问题之后,在11.2.0.4的版本中进行了测试,之前我碰到的那个问题在这个版本中就不复存在了,兔子威武.

测试复现的过程很简单:

create table test_bug as select * from dba_objects where rownum<1;

解析生成执行计划,可以看到这个时候就没有问题了.

可见这个问题在11.2.0.4之前的版本会抛出ORA-00600,算是一个bug中的bug吧.

7简单总结

通过上面波澜起伏的测试和复现、验证,我们可以得出这样的一个结论:这个问题和表中的数据量无关,和是否使用子查询也没有关系,是在特定版本中出现的一个特定的问题,当然明白了原委,我们完全可以规避这个问题.

而且这个场景中Merge的使用有些不太到位,其实也可以考虑使用INSERT语句来实现.

8反思

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读