您的位置:首页 > 数据库 > Oracle

关于oracle 12c SQL语句执行结果与11g不一致的问题

2015-09-08 17:20 537 查看
将原有的系统迁移到oracle 12c上面,版本是12.1.0.2,总是有各种问题出现,不得不说,目前的版本真是个坑。

开发一条sql语句,insert .....select形式,单独执行select部分有结果,但insert。。。select的时候,显示插入结果为0,同样的数据,该语句放在10g,11gR1上都没问题,能够插入数据。只能说恭喜发财了。

语句如下:

insert all when nvl
((BM10060851_2), 0) <> 0 then into KPI.KPI_ORGAN
(data_date, organ_code, curr_type, kpi_code, KPI_FREQ, KPI_VALUE)
values
(to_date('20150730', 'YYYYMMDD'),
org_no,
'00',
'BM10060851',
'Q',
BM10060851_2)
select --/*+optimizer_features_enable('11.2.0.3')*/
org_no,
'00',
to_number((count(distinct case
when GL_TYPE = 'Q' then
ACCT_NO
END)),'9999999999999999999999.999999') BM10060851_2
from CMDATA.C_S_ELEC_TX_ORG T
where chan_type = 'P01'
and tran_status = '0'
and data_dt = to_date('20150630', 'YYYYMMDD')
group by org_no, '00'

-------------------------------------------------------------------------------------------------------------------------------------------
采用optimizer_features_enable指定优化器版本,发现11.2.0.4的时候,也会出现该问题,但11.2.0.3及以下版本就可以正常插入了。

对此表示很无奈,定然是oracle的bug,而且可以说是很严重的bug,如果这个问题不是在测试库上发现而是在生产上,想想都觉得无语。

在itpub上看到过类似的问题,也是sql语句在12c上执行没有结果,在之前的版本就可以,那哥们还开了sr给oracle,我这边客户也和原厂联系了,不知道是不是也要开个sr。

一般对于这种问题,其实改写下写法多多数是可以避免的,比如客户在调试的时候就将select部分的case那块给改写了,这条语句就有结果,或者将insert all后面那个when部分去掉,也是可以正常插入结果。。。。

但开发人员多是不愿意更改语句的,涉及到大量的程序,而且这个问题确实存在比较大的隐患,说不好下次写出类似语句便中招了,还是寄希望于oracle能及时处理吧。

当然,针对该语句而言,如果急着使用的话,我觉得将hint,将优化器版本降低点也是可以对付过去的。

--------------------------------------------------------------------------------------------------------------------------------------------

写这个案例呢,倒不是跟以往那样提供啥解决方案,而是想给自己一点关于解决问题的思考。

比如一开始遇到这个问题的时候,我便没有想到通过改写语句来避免这个情况,而是执着于去metalink上查找类似的bug,结果一无所得,

也体现出了我思维的僵硬一面,很多问题不一定都会有明确的解决措施,也不一定你都是第二个遇到这个问题的人,如果哪天你是第一个了,

是不是该考虑下创造历史,也为后来者做点贡献,毕竟这些年都在受惠于网络,于他人。

另一方面,知识也决定了思维,狭隘的知识面终究只会在那一亩二分地里面摸索,跳不出来,也就难以达到新的高度,多学习,也便能多遇未知,有未知方能去思索,探索,如此这般,才能让自己站在不同的高度去看过去的风景。也许曾经折磨自己死去活来的问题,再回首时,一览众山小。

--------------------------------------------------------------------------------------------------------------------------------------------

累了就休息,清闲了就看点书,遇到不解之处就多思考,学到东西就多总结,多分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: