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表中。
| « | 八月 2008 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |