Sql语句中关于in 参数的操作
2010-11-03 21:25
274 查看
工作中遇到一条查询语句,需要传入多个值,类似这样的语句: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
链接一中收获了一种比较好的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
相关文章推荐
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 关于标准SQL语句的操作
- 关于sql语句in的使用注意规则( 转)
- 关于SQL语句参数中为多个带‘,’的字符串
- sql语句与执行update更新操作内的参数顺序关系
- 总结一些关于操作数据库是sql语句还是存储过程问题
- 关于Python操作Mysql数据库时SQL语句的格式问题(mysql语句中的双引号问题)
- jfinal3.0+在SQL语句中使用in传递参数的方法
- 关于无限级分类的sql语句操作
- 关于mysql的常见操作SQL语句
- 关于sql语句的一些操作 行列转换(转)
- 关于in 和 exist 的区别-------------近期优化sql 语句的时候再次碰到
- JdbcTemplate底层操作在IN语句中传入一组参数值实例
- PrepareStatement sql语句in中多个参数的实现
- SQL语句中关于日期的操作(非常的有用)
- SQL存储过程参数内容通过XML格式传送,把所有SQL语句操作放到一个存储过程里
- 关于sqlmap执行sql语句 二,关于sqlmap执行语句的前后台相关参数的传递
- c# 操作mssql数据库 含有带参数sql语句运行
- C#中操作Oracle时的SQL语句参数的用法
- 关于C#执行多个SQL语句的一些操作——Note on Dec. 19th