zoukankan      html  css  js  c++  java
  • Sql语句中关于in 参数的操作

      工作中遇到一条查询语句,需要传入多个值,类似这样的语句:select * from table  where column in (:param)。在sql server中可以使用动态语句来拼凑执行。在oracle中不知道怎样处理,所以只能出大招,上网找资料,很幸运找到了解决办法,所以记录一下,主要参考链接:1、http://www.sommarskog.se/arrays-in-sql-2005.html   2、http://dev.firnow.com/course/7_databases/oracle/oraclexl/20090304/158057.html

      链接一中收获了一种比较好的sql语句书写方式,其中有很详细的描述;有一点较可惜的是这篇文章只提到了sql server 的相关操作。不过通过启发可以将上述sql语句改写为

    select * 
    from table a
    inner join ufn_condition_list(:param) b
    on a.column=b.column_value

    其中函数ufn_condition_list的作用为将类似于"'1','2','3'"这样的参数进行处理,返回table类型对象同查询表进行关联。oracle函数无法像sql server函数那样直接返回表数据,通过查询之后发现可以使用PIPELINED函数来返回表集合,可以阅读下以下两个链接:1、http://www.oracle-base.com/articles/9i/PipelinedTableFunctions9i.php   2、http://database.51cto.com/art/201004/194462.htm

      链接二中收获了split功能的函数,且返回表集合,分为两步:

        1、创建table类型 

    CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2(4000

        2、进行切分,并使用PIPELINED函数来返回表集合

    代码
    create or replace function split
    (
           p_list 
    in varchar2,
           p_sep 
    in varchar2 default ’,’

    return type_split pipelined 
    AS 
     l_idx pls_integer; 
     v_list 
    varchar2(50) := p_list; 
    begin 
          loop 
              l_idx :
    = instr(v_list,p_sep); 
               
    if l_idx > 0 then 
                   
    pipe row(substr(v_list,1,l_idx-1)); 
                   v_list :
    = substr(v_list,l_idx+length(p_sep)); 
               
    else 
                    
    pipe row(v_list); 
                    
    exit
               
    end if
          
    end loop; 
         
          
    return
    end split;

     

      最后,我们可以将原查询语句修改为以下语句,执行性能也可以有所保障

    select * 
    from table a
    inner join table(split(:param)) b
    on a.column=b.column_value




  • 相关阅读:
    Android简易注解View(java反射实现)
    android注解[Jake Wharton Butter Knife]
    Android渠道汇总
    SVN管理规范
    马上着手开发iOS应用程序一 todolist
    MVC记录
    OC中intValue要注意的地方
    将从数组中取到的字符串赋值给了UIImage导致的错误
    一个null引发的错误
    记录一些容易忘记的属性 -- UITabBarController
  • 原文地址:https://www.cnblogs.com/WGZ_Home/p/1868479.html
Copyright © 2011-2022 走看看