oracle – 将bind变量与LIKE%运算符一起使用

前端之家收集整理的这篇文章主要介绍了oracle – 将bind变量与LIKE%运算符一起使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的PL / sql中有这个使用绑定变量的大型动态sql.我使用DBMS_sql包来绑定并执行生成查询.

根据某些条件,where子句被添加到动态sql中.当我只使用“in”或“=”来匹配我的绑定变量时,一切正常,结果返回得非常快.

例:

(servedparty =:bv_或servedpartyimsi =:bv_)

但是,当我执行以下操作时:

(servedpartyimei like :bv_)

并提供类似12345679890%的值,查询需要非常长的时间.

我也尝试过像这样的东西

(servepartyimei喜欢:bv_ ||’%’)

然后提供没有’%’的值,但它给出相同的结果

当我执行没有绑定变量的查询但只是放入硬编码值时,结果也立即返回.

我在这里做错了吗?不要像LIKE运算符那样绑定变量吗?
有任何想法吗?

谢谢.

解决方法

我认为您正在遭受Oracle错误9197434(使用DBMS_sql时没有发生的绑定PEEKING)

据我所知,这还没有解决.

没有绑定变量偷看的好处,Oracle不知道LIKE条件右侧的值是什么.例如,它可能只是’%’.因此,Oracle假设有多少行将像典型的绑定变量值一样.这些假设非常保守,很可能迫使Oracle远离您想要的快速计划(可能使用索引)来实现您正在获得的缓慢计划(可能使用散列连接).

如果可能的话,我建议你使用Native Dynamic sql(即EXECUTE IMMEDIATE),因为它不会受到这个bug的影响.否则,您可能需要提示您的sql.

猜你在找的Oracle相关文章