PLSQL 通过一个字符串变量传给一个SQL,这个字符串是SQL中的 in 里面的要找的字段的值,我该怎么办,谢谢各位了先

时间:2022-09-03 16:11:55
大致是这样的,
create or replace test(invalue in varchar2)
is
strsql varchar2(4000); 
begin

strsql := 'select * from mytable where a in (:invalue)';
execute immediate strsql using invalue; 
 
end test;
类似于这样的功能应该怎么实现啊,注意我的a 字段是字符型的,也就是说输入的可能会是'aaa','bbb'类似于这样的值,不知道用数组可不可以实现,各位多帮帮小弟忙,不胜感激 

11 个解决方案

#1


用动态SQL最简单了,否则要拆分字符串

#2


看一下:

http://www.oracle.com.cn/viewthread.php?tid=123823

注意 Oracle开发中的程序(procedure、function、trigger)要和 界面中的应用程序(.net、c#、jsp)分开,不要搅到一起。

#3


现在的问题是这样的因为有字符串判断的存在,而且我的表名什么的都是在变动的,所以必须要用拼字符串的方法来实现

#4


用动态SQL,用一个值接一下传进来得值,就可以了
例如:

如果invalue是'aa','bb'的形式的话
inTempValue := invalue ;

如果invalue是'aabbcc'的话就拆分字符串

#5


谢谢这位大哥,我现在只是想写一个后台的plsql,不涉及到前台

#6


FYI:问题14:
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html
引用楼主 wangpeng8675 的帖子:
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现啊,注意我的a 字段是字符型的,也就是说输入的可能会是'aaa','bbb'类似于这样的值,不知道用数组可不可以实现,各位多帮帮小弟忙,不胜感激 

#7


问题是当传入的值是'aa','bb'的形式的话,我放到in()里面其中的,是不认的,也就是说我还是什么都查啊不出来啊,谢谢你的热心帮助

#8


ORACLE会把它当成一个字符串值,所以要改成下面的形式:
CREATE OR REPLACE TEST(INVALUE IN VARCHAR2) 
IS 
   STRSQL VARCHAR2(4000); 
BEGIN 

   STRSQL := 'SELECT * FROM MYTABLE WHERE A IN ('||INVALUE||')'; 
   EXECUTE IMMEDIATE STRSQL; 

END TEST;
引用 7 楼 wangpeng8675 的回复:
问题是当传入的值是'aa','bb'的形式的话,我放到in()里面其中的,是不认的,也就是说我还是什么都查啊不出来啊,谢谢你的热心帮助

#9


引用 6 楼 mantisXF 的回复:
FYI:问题14: 
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html引用楼主 wangpeng8675 的帖子:
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现啊,注意我的a 字段是字符型的,…


         vc_sql2 := 'insert into test_range(weidu,smallrang,bigrange,numcount,SUMCOUNT,pen,sumpen) 
         SELECT :vc_weidu' || ',
         to_char(' || i_init_range || ')' || ',to_char(' ||
                    (i_init_range + i_range) || ')
         ,COUNT(*)
         ,sum(' || vc_i_sumcount || ') 
         ,round(COUNT(*)/(' || i_count || '),4)*100 
         ,round(sum(' || vc_i_sumcount || ')/(' || i_sum ||
                    '),4)*100      
          from ' || temp_tablename || whsql || ' and round(' ||
                    vc_i_duliang || ') >= ' || i_init_range || ' 
         and round(' || vc_i_duliang || ')<=' ||
                    (i_init_range + i_range) || ' and ' || vc_i_dimension ||
                    '=:vc_weidu2 ';

这是那个主要的SQL whsql里面是我的一些where条件,我现在主要要做的就是在里面再加入一个关于用到in或者exist这两个关键字的条件的筛选,但是碰到了很多的问题,怎么也走不通,不知道又没有人能给个解决方案,plsql里面这种传字符串实在是很不方便的。

#10


FYI: 8楼代码
引用 9 楼 wangpeng8675 的回复:
引用 6 楼 mantisXF 的回复:
FYI:问题14: 
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html引用楼主 wangpeng8675 的帖子: 
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现…

#11


谢谢 mantisXF 的帮助,做得有点太灵活了,有点晕了,就这么解决吧,就让用户直接输入'a','b'的形式了,原理是想就输a,b,c的,看来很麻烦先去结贴了,多谢 

#1


用动态SQL最简单了,否则要拆分字符串

#2


看一下:

http://www.oracle.com.cn/viewthread.php?tid=123823

注意 Oracle开发中的程序(procedure、function、trigger)要和 界面中的应用程序(.net、c#、jsp)分开,不要搅到一起。

#3


现在的问题是这样的因为有字符串判断的存在,而且我的表名什么的都是在变动的,所以必须要用拼字符串的方法来实现

#4


用动态SQL,用一个值接一下传进来得值,就可以了
例如:

如果invalue是'aa','bb'的形式的话
inTempValue := invalue ;

如果invalue是'aabbcc'的话就拆分字符串

#5


谢谢这位大哥,我现在只是想写一个后台的plsql,不涉及到前台

#6


FYI:问题14:
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html
引用楼主 wangpeng8675 的帖子:
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现啊,注意我的a 字段是字符型的,也就是说输入的可能会是'aaa','bbb'类似于这样的值,不知道用数组可不可以实现,各位多帮帮小弟忙,不胜感激 

#7


问题是当传入的值是'aa','bb'的形式的话,我放到in()里面其中的,是不认的,也就是说我还是什么都查啊不出来啊,谢谢你的热心帮助

#8


ORACLE会把它当成一个字符串值,所以要改成下面的形式:
CREATE OR REPLACE TEST(INVALUE IN VARCHAR2) 
IS 
   STRSQL VARCHAR2(4000); 
BEGIN 

   STRSQL := 'SELECT * FROM MYTABLE WHERE A IN ('||INVALUE||')'; 
   EXECUTE IMMEDIATE STRSQL; 

END TEST;
引用 7 楼 wangpeng8675 的回复:
问题是当传入的值是'aa','bb'的形式的话,我放到in()里面其中的,是不认的,也就是说我还是什么都查啊不出来啊,谢谢你的热心帮助

#9


引用 6 楼 mantisXF 的回复:
FYI:问题14: 
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html引用楼主 wangpeng8675 的帖子:
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现啊,注意我的a 字段是字符型的,…


         vc_sql2 := 'insert into test_range(weidu,smallrang,bigrange,numcount,SUMCOUNT,pen,sumpen) 
         SELECT :vc_weidu' || ',
         to_char(' || i_init_range || ')' || ',to_char(' ||
                    (i_init_range + i_range) || ')
         ,COUNT(*)
         ,sum(' || vc_i_sumcount || ') 
         ,round(COUNT(*)/(' || i_count || '),4)*100 
         ,round(sum(' || vc_i_sumcount || ')/(' || i_sum ||
                    '),4)*100      
          from ' || temp_tablename || whsql || ' and round(' ||
                    vc_i_duliang || ') >= ' || i_init_range || ' 
         and round(' || vc_i_duliang || ')<=' ||
                    (i_init_range + i_range) || ' and ' || vc_i_dimension ||
                    '=:vc_weidu2 ';

这是那个主要的SQL whsql里面是我的一些where条件,我现在主要要做的就是在里面再加入一个关于用到in或者exist这两个关键字的条件的筛选,但是碰到了很多的问题,怎么也走不通,不知道又没有人能给个解决方案,plsql里面这种传字符串实在是很不方便的。

#10


FYI: 8楼代码
引用 9 楼 wangpeng8675 的回复:
引用 6 楼 mantisXF 的回复:
FYI:问题14: 
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html引用楼主 wangpeng8675 的帖子: 
大致是这样的, 
create or replace test(invalue in varchar2) 
is 
strsql varchar2(4000); 
begin 

strsql := 'select * from mytable where a in (:invalue)'; 
execute immediate strsql using invalue; 

end test; 
类似于这样的功能应该怎么实现…

#11


谢谢 mantisXF 的帮助,做得有点太灵活了,有点晕了,就这么解决吧,就让用户直接输入'a','b'的形式了,原理是想就输a,b,c的,看来很麻烦先去结贴了,多谢