将原有的系统迁移到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,结果一无所得,
也体现出了我思维的僵硬一面,很多问题不一定都会有明确的解决措施,也不一定你都是第二个遇到这个问题的人,如果哪天你是第一个了,
是不是该考虑下创造历史,也为后来者做点贡献,毕竟这些年都在受惠于网络,于他人。
另一方面,知识也决定了思维,狭隘的知识面终究只会在那一亩二分地里面摸索,跳不出来,也就难以达到新的高度,多学习,也便能多遇未知,有未知方能去思索,探索,如此这般,才能让自己站在不同的高度去看过去的风景。也许曾经折磨自己死去活来的问题,再回首时,一览众山小。
--------------------------------------------------------------------------------------------------------------------------------------------
累了就休息,清闲了就看点书,遇到不解之处就多思考,学到东西就多总结,多分享。