写在前@H_301_2@
今天有一个业务,前台是一个供用户选择条件进行查询的功能。选择完毕后点击查询,前台使用get方式发送打包好的参数列表到后台(Controller),持久层拿到参数列表后拼装到sql中,使用jdbc连接oracle拿数据。
问题@H_301_2@
当条件过大(据说有7000多个数据),出现第一个问题,413FULL HEAD ERROR@H_301_2@。很明显是数据量过大,而使用的又是get方式传输,get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。@H_301_2@如:login.action?name=cym&password=idontknow。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。@H_301_2@GET方式提交的数据依据浏览器而定,IE环境下的URL长度限制为2083,理论上POST没有限制,可传较大量的数据。@H_301_2@@H_301_2@@H_301_2@@H_301_2@@H_301_2@
第二个问题出现在sql,拼接字符串中使用的where...in..,@H_301_2@JDBC会抛出“java.sql.sqlException:ORA-01795:列表中的最大表达式数为1000”这个异常。没想到oracle还有这种限制,据说11g后不存在这个限制。@H_301_2@
@H_301_2@
一 使用临时表 @H_301_2@SELECT * FROM t WHERE id IN (SELECT id FROM temp)@H_301_2@@H_301_2@
建立一个表来存储传入参数,取数据的时候先从临时表中遍历取参数,然后再将取出的参数拿去作为in条件@H_301_2@
@H_301_2@
二使用exists @H_301_2@@H_301_2@SELECT * FROM a WHERE EXISTS( SELECT 1 FROM b WHERE a.employee_id=b.employee_id)@H_301_2@@H_301_2@@H_301_2@@H_301_2@
@H_301_2@@H_301_2@@H_301_2@@H_301_2@
IN比 EXISTS 的可读性更好@H_301_2@
原文链接:https://www.f2er.com/oracle/212550.html