工作中遇到一条查询语句,需要传入多个值,类似这样的语句: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语句改写为
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类型
2、进行切分,并使用PIPELINED函数来返回表集合
(
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;
最后,我们可以将原查询语句修改为以下语句,执行性能也可以有所保障
from table a
inner join table(split(:param)) b
on a.column=b.column_value