oracle存储过程传入varchar型参数用于查询中in的问题

lan125709702 2009-07-12 09:12:41
输入参数b varchar2 '1,2,3,4,5,6,7 '
但是过程 中查询的时候是select * from table where id in(b)
这样查询出来的效果是select * from table where id in('1,2,3,4,5,6,7')


注意,请不要说用instr这个函数,这个函数我刚刚测了一下,没有得到好的效果,
当表中 id 有一个为1,有一个 为11时,
输入参数 b:='11,2'
select * from table where id in(b);
oracle会返回三个值 ,把id为1,11,2都会返回,不信的可以去试试
...全文
646 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
robin_ares 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 lan125709702 的帖子:]
输入参数b varchar2 '1,2,3,4,5,6,7 '
但是过程 中查询的时候是select * from table where id in(b)
这样查询出来的效果是select * from table where id in('1,2,3,4,5,6,7')


注意,请不要说用instr这个函数,这个函数我刚刚测了一下,没有得到好的效果,
当表中 id 有一个为1,有一个 为11时,
输入参数 b:='11,2'
select * from table where id in(b);
oracle会返回三个值 ,把id为1,11,2都会返回,不信的可…
[/Quote]

你可以 把 '11,2' 加工成 ',11,2,'
字段也加工成',1,'
这样就可以用instr了
mantisXF 2009-07-13
  • 打赏
  • 举报
回复
-- 这样是可以的:
SQL> SELECT * FROM TEST_B;

BID CID
---------- ----------
11 5
1 1
2 1
3 2
4 2
5 3

6 rows selected

Executed in 0.016 seconds

-- 错误的:
SQL> SELECT *
2 FROM TEST_B
3 WHERE INSTR('11,4,5',BID) > 0;

BID CID
---------- ----------
11 5
1 1
4 2
5 3

Executed in 0.016 seconds

-- 正确的:
SQL> SELECT *
2 FROM TEST_B
3 WHERE INSTR(','||'11,4,5'||',',','||BID||',') > 0;

BID CID
---------- ----------
11 5
4 2
5 3

Executed in 0.015 seconds
[Quote=引用 6 楼 lan125709702 的回复:]
楼上那位兄弟 ,你这样不行。。
b:='11,2'

sp中:
b:= ','||b||',';
select * from table where
instr(b,','||to_char(id)||',') > 0;

你这样还是会把 id为1,11,2的三个都测试出来,我刚刚已经测了
[/Quote]
lan125709702 2009-07-13
  • 打赏
  • 举报
回复
不好意思,没有仔细看,这样是可以的,谢谢13楼,14楼的帮忙



SQL> SELECT *
2 FROM TEST_B
3 WHERE INSTR(','||'11,4,5'||',',','||BID||',') > 0;
lan125709702 2009-07-13
  • 打赏
  • 举报
回复


SQL> select * from test1;

ID
----------
1
2
3
4
5
6
7
11

8 rows selected

SQL> select * from test1 where instr(',11,2,',id) > 0;

ID
----------
1
2
11

SQL>



回13楼,14楼,还是没用,我刚刚试了下,还是会找到三个值!
suncrafted 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lan125709702 的回复:]
这是过程:
create or replace procedure test(a IN varchar2) is
b varchar2(200);
begin

b:= ','||a||',';

select count(*) into b from test1 where INSTR(b,id )>0;
dbms_output.put_line(b);
end;
这是表的记录:
ID
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 11

然后测试存储过程,
a的value值是 11,2
要不要我把脚本全部放上来?
[/Quote]

我不知道你有没有看清我上面的回复,我的回复内容是这样的:
sp中:
b:= ','||b||',';
select * from table where
instr(b,','||to_char(id)||',') > 0;
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
睡前顶一下!
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
最后输出是3
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
这是过程:
create or replace procedure test(a IN varchar2) is
b varchar2(200);
begin

b:= ','||a||',';

select count(*) into b from test1 where INSTR(b,id )>0;
dbms_output.put_line(b);
end;
这是表的记录:
ID
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 11

然后测试存储过程,
a的value值是 11,2
要不要我把脚本全部放上来?
suncrafted 2009-07-12
  • 打赏
  • 举报
回复
你把你sp帖出来看看
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
不过还是要谢谢楼上的兄弟 了
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
楼上那位兄弟 ,你这样不行。。
b:='11,2'

sp中:
b:= ','||b||',';
select * from table where
instr(b,','||to_char(id)||',') > 0;

你这样还是会把 id为1,11,2的三个都测试出来,我刚刚已经测了
suncrafted 2009-07-12
  • 打赏
  • 举报
回复
instr可以这么做:

输入参数 b:='11,2'
sp中:
b:= ','||b||',';
select * from table where
instr(b,','||to_char(id)||',') > 0;
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
在线等答了,求高手解答
老张-AI 2009-07-12
  • 打赏
  • 举报
回复
学习了
lan125709702 2009-07-12
  • 打赏
  • 举报
回复
嘿嘿,我现在就是采用动态 SQL,只是我想多了解了解oracle在这方面有没有什么更好的解决方法,先谢谢cosio了!
cosio 2009-07-12
  • 打赏
  • 举报
回复
用动态的SQL应该可以了!
v_sql:="select * from table where id in('1,2,3,4,5,6,7')";
exec immediate v_sql;

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧