oracle如何把得到的值作为参数传入到 sql中

报错

select wm_concat(job_id)-- 10g

         into v_job_id_str 
        from ne_job_element
        where event_id is null 
        and ne_id = p_neId;

      

     open cur_job for
          --  execute immediate sql_str;
           select j.*    
           from ne_job j  
           where j.job_id in (  v_job_id_str  )  ;
           
           Loop
             fetch cur_job into r_job;
              exit when cur_job%notfound;
               dbms_output.put_line('-----'||cur_job%rowcount );


         end loop;
      
     close cur_job;



INSTR (源字符串, 目标字符串, 起始位置, 匹配序号)

  在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,就是说从字符的开始到字符的结尾就结束。

  语法如下:  instr( string1, string2 [, start_position [, nth_appearance ] ] )

  参数分析:  string1  源字符串,要在此字符串中查找。

   string2  要在string1中查找的字符串.

   start_position  代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。

  nth_appearance  代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。


修改后:

 open cur_job for
          --  execute immediate sql_str;
           select j.*    
           from ne_job j  
           where instr(',' || v_job_id_str || ','  ,  ',' || j.job_id || ',') > 0;
           
           Loop
             fetch cur_job into r_job;
              exit when cur_job%notfound;
               dbms_output.put_line('-----'||cur_job%rowcount );


         end loop;
      
     close cur_job;


解决方法参考:

关于pl/sql中存储过程传入数值参数时进行按逗号分割的方法——Oracle  前两天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。

但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如 select * from table_name_1 where id in (1,2,3,4,5) ,其中的1,2,3,4,5即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (1,2,3,4,5)这条语句会认为1,2,3,4,5是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将 1,2,3,4,5 判定为 '1,2,3,4,5' ,而'1,2,3,4,5'是一个字符串,这时候sql执行的实际上是 select * from table_name_1 where id in (‘1,2,3,4,5’) ,而id是一个number型的,这时候就会报错。
原存储过程大致如下:
create or replace procedure test_prc(an_id in number)
is
begin 
insert into tmp_table
select * from table_name_1 where id in (an_id);
commit;
end;

如上述的存储过程,由于传入的参数an_id是一个number型的,如果是一个单独的数字,过程执行没有问题,但如果是一个字符串,如'1,2,3,4,5',这样就会报错,因为'1,2,3,4,5'是一个varchar。
如果将传入的参数an_id 改为varchar型的,如 create or replace procedure test_prc(an_id in varchar) ,这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是'1,2,3,4,5',这时候,也会报错。
这种情况据我所知可以有两种方法来解决,第一种是使用动态sql;第二种是使用instr函数来解决。有的朋友使用的是动态sql,我没使用这种方法,第一是自己不太会写,第二是觉得太繁琐。这里重点说的是使用instr函数。以后可能也会尝试使用动态sql来试试看,到时候再来更新吧。
其实使用instr函数也没有什么多说的,仔细看懂了理解了就行了,先贴出结果吧。
create or replace procedure test_prc(an_id in varchar)
is
begin 
insert into tmp_table
select * from table_name_1 where instr(',' || an_id || ','  ,  ',' || id || ',') > 0;
commit;
end;

INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上',',是为去掉当查询11的时候,会将1和11都取出来。
至此,问题解决。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值