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函数来返回表集合

ExpandedBlockStart.gif 代码
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/archive/2010/11/03/1868479.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值