WHERE IN LIST

场景:应用的前台传入一个字符串,而且此字符串具有指定的分隔符,并且长度不定,根据传入的字符串查询对应的结果。
1.使用动态SQL解决

将字符串拆分(例如Javasplit函数),然后拼凑到SQL语句中。

缺点:WHERE子句中IN列表中元素的个数必须 <= 1000;列表的数目不确定,无法使用绑定变量,影响效率。

解决:首要考虑就是解决列表长度问题和效率问题,效率问题中首要考虑绑定变量的问题,其次是cardinality对执行计划的影响。

点击(此处)折叠或打开

  1. --1. 使用静态SQL
  2. SET SERVEROUTPUT ON

  3. DECLARE
  4.   v_condition VARCHAR2(100);
  5.   v_sql VARCHAR2(1000);
  6.   v_count NUMBER(10);
  7. BEGIN
  8.   v_condition := \'\'\'XY\'\'\' || \', \' || \'\'\'YZ\'\'\';
  9.   dbms_output.put_line(v_condition);
  10.   --静态SQL
  11.   SELECT COUNT(*) INTO v_count FROM t WHERE object_name IN (v_condition);
  12.   dbms_output.put_line(\'static sql:\' || v_count);
  13.   
  14.   --动态SQL
  15.   v_sql := \'SELECT COUNT(*) FROM t WHERE object_name IN (\' || v_condition || \')\';
  16.   dbms_output.put_line(v_sql);
  17.   EXECUTE IMMEDIATE v_sql INTO v_count;
  18.   dbms_output.put_line(\'dynamic sql:\' || v_count);
  19. END;
  20. /


  21. \'XY\', \'YZ\'
  22. static sql:0
  23. SELECT COUNT(*) FROM t WHERE object_name IN (\'XY\', \'YZ\')
  24. dynamic sql:2
  25. --结论:打印出来的为动态拼凑的SQL, 而执行的是静态SQL

  26. --本章要执行的语句
  27. SELECT COUNT(*) FROM t WHERE object_name IN (\'XY\', \'YZ\');
  28.   COUNT(*)
  29. ----------

  30.          2
  31. --实际执行的语句.
  32. SELECT COUNT(*) FROM t WHERE object_name IN (\'\'\'XY\'\', \'\'YZ\'\'\');

使用动态SQL,可以得出正确的结果,但会拼凑很多常量,而且数目不定,会导致无法使用绑定变量而影响效率。

并且IN列表中元素个数要< 1000。实际开发不推荐。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1070846/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1070846/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值