我有一些代码可以进行oracle调用。我想知道我尝试这样做的方式是否可以做得更好,或者oracle代码是否更有效。
我主要关注的是对UPPER('%Variable%')
进行比较。在鞋帮上面的外卡看起来有可能很危险。
结果可以返回超过50k的结果(预计将来会大幅增长)。
1 = 1的目的只是为了使代码的其余部分更简单,并认为它不会对sql造成太大的伤害。
<c:set var="sqltext">
SELECT var1, var2, var3 from var_table
WHERE 1=1
<c:if test="${!empty param.var1}"> AND UPPER(var1) LIKE UPPER('%${param.var1}%')</c:if>
<c:if test="${!empty param.var2}"> AND UPPER(var2) LIKE UPPER('%${param.var2}%')</c:if>
<c:if test="${!empty param.var3}"> AND var3 = '${param.var3}'</c:if>
</c:set>
<sql:query var="data" dataSource="mydatasource" sql="${sqltext}"/>
非常感谢任何帮助。感谢
答案 0 :(得分:0)
我在网上进行了一些彻底的研究后最终做的是删除了所有UPPER和通配符的使用。
通过始终存在通配符(主要是前导通配符),它会删除索引的使用并使其始终进行全表扫描,即使没有必要也是如此。另一种方法是使用conText索引,但它们似乎不适合我当前的应用程序。
通过删除上层我只是使搜索过滤器区分大小写,其中,在查看公司网站后,大多数搜索过滤器都区分大小写。
通过删除通配符,我只需强制用户必须将它们输入搜索过滤器本身。 (对于sql注入,这将是一个非常危险的地方,但该项目仅供内部使用)
我最终保持1 = 1以保持代码简单(它允许我的所有if条件以AND
语句开头,而不必检查是否存在其他条件。