刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将近两年的时间,对SqlServer相对来说很熟悉,比较而言,Oracle真心很痛苦,脚本编写费力,错误调试费力,哎,各种费力。
估计各路大神很不屑,甚至鄙视,会说Oracle怎么怎么好。我只是说,Oracle在对待开发者着实不如SqlServer友好,至于性能我不提及。
最近项目由SqlServer迁移到Oracle下,有很多脚本出现问题需要调整。其中一条诡异的错误,折腾的很郁闷。
问题大致是这样子的。
先找出我所在的部门,并可能做其他相应的处理。
select department from users where username = 'eyuan'
然后找出我部门的任务。
select taskname from tasks where department in ("+myDepartments+")
这个时候就报错了,始终提示ora-03113的错误,然后确认后提示ora-03114。
网上查找资料后,大家的经验多数是网络的问题,需要配置网络连接参数等,但问题是,查出的部门可能是'a','b','c','d','e',然后我删除几个等又没了问题,感觉和Sql语句有关系,而非网络问题。
最后终于找到原因,其实是表设计、Sql语句、网络连接三者共同作用的结果。
我查找了表结构,发现定义了N多没用的索引,然后删除掉后,由原来的'a','b'增加到'a','b','c','d',但到了'e',仍然错误。
后来把第一个查询部门的语句整合到第二个查询任务的语句中,然后OK了。
原来Oracle的In语句对于字符串列表变量的处理有一定的玄机。
所以,对于那些非从表中查询得出的,可以通过select 'a' from dual union select 'b' from dual来处理。
哎,Oracle并没有报查询超时的问题,直接报网络连接,不够细致,对于新手来说,确认比较痛苦。