如何传集合型参数

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

首先是参数用什么类型?然后是在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表中。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9844649/viewspace-579987/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9844649/viewspace-579987/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值