比如有一张用户表userinfo(id ,name ,sex ,....)表中大概有10万条左右的纪录,现在用户给了一张excle表中大概列出了2万左右的用户的“name”的清单(这里名字假设为A1,A2,A3 .... ,A20000),现在要根据这个清单找出这2万左右用户的信息,于是我先读取了excle组合成了下面的sql语句:
 select *  from userinfo where name in ('A1','A2',....,'A999') or name in('A1000','A1001',....,'A1999') or name in ('A2000','A2001',....,'A2999') ...... or name in ('A19000','A19001',....,'A19999') or name in ('A20000');
由于用的是oracle 10g查询语句中如果in()中不是子查询语句的话,是具体的值则不能超过1000个,所以我分成了21组in组成了上面的SQL语句,但是这种查询效率很低,并且当组和的个数大概超过16个以上也就是in的参数有16000个以上时,将上面的sql语句用plsql执行时会报错:“ORA-03113: 通信通道的文件结束”。这个错误我找了好多资料也没有解决,所以我打算从sql方面进行优化,不知道大家有没有遇到过这种问题。请大家帮忙看下能帮我把sql给优化一下,或者能告诉我怎么解决“ORA-03113: 通信通道的文件结束”这个问题也行,谢谢!
操作系统 : windows Server 2003  , 数据库版本 :Oralce Database 10g Enterprise 10.2.0.1.0