伟哥的博客

一个IT从业者

« | »

如何传集合型参数

davidyu720 | 07 七月, 2007 10:22

想传入查询参数到存储过程中,但参数代表一个集合。不知该如何实现。

首先是参数用什么类型?然后是在PL/SQL中查询语句的条件该如何写?
期望的SQL查询是类似这样的:
select * from aaa where col1 in (v1, v2, v3, v4)


想传入查询参数到存储过程中,但参数代表一个集合。不知该如何实现。

首先是参数用什么类型?然后是在PL/SQL中查询语句的条件该如何写?
期望的SQL查询是类似这样的:
select * from aaa where col1 in (v1, v2, v3, v4)

比较自然的想法是:传入参数为CSV格式的字符串如'1,2,3,4'或'abc,def,ghi',程序对其进行分解,存放到临时表中,然后查询条件这样写 where col1 in(select col1 from temptable where ...)

进一步:能不能不用临时表呢?查了一些资料,发现可以用table()函数结合嵌套表或VARRAY表来实现。具体如下:

0)定义一个嵌套表类型
create or replace type t_table_NUMBER as table of number;
1)定义一个传入字符串参数,传入CSV格式串
2)在程序中实例化表变量,然后分析字符串参数,得到若干元素,逐一保存到该表中;
3)查询时使用 ... in (select * from table(v_tab)

解析的代码可以参考 hanjs的博客 http://hanjs.itpub.net/post/28217/260065

补充一点:如果集合类型是字符串,也就是均以字母开头,可以用dbms_utility.comma_to_table 将CSV串转换到一个Index_by表中。但table()函数不支持Index_by表,必须写代码将Index_by表复制到一个嵌套表或VARRAY表中。

最新回复

发表评论

authimage

 
Accessible and Valid XHTML 1.0 Strict and CSS
Powered by pLog - Design by BalearWeb