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




原文地址:https://www.cnblogs.com/WGZ_Home/p/1868479.html