`

oracle之存储过程中传入以逗号分割字符串,解决多参数问题

阅读更多
这几天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。
但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from account where id in (11,23,202,41),其中的11,23,202,41即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (11,23,202,41)这条语句会认为11,23,202,41是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将11,23,202,41判定为'11,23,202,41',而'11,23,202,41'是一个字符串,这时候sql执行的实际上是select * from table_account where id in ('11,23,202,41'),而id是一个number型的,这时候就会报错。
原存储过程大致如下:
create or replace procedure test_prc(an_id in number)
is
begin
insert into tmp_account
select * from account where id in (an_id);
commit;
end;
如果将传入的参数an_id 改为varchar型的,如create or replace procedure test_prc(an_id in varchar),这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是'11,23,202,41',这时候,也会报错。

使用instr函数可以解决:
create or replace procedure test_prc(an_id in varchar)
is
begin
insert into tmp_account
select * from account where instr(',' || an_id || ','  ,  ',' || id || ',') > 0;
commit;
end;
INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上',',是为去掉当查询11,23,202,41的时候,会取出1,11,2,3,23等。至此,问题解决。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics