create or replace procedure testts(listports in varchar2)
AS       theSlot varchar2(50);
       theRate varchar2(50);       TYPE rc is REF CURSOR;       v_rc rc;begin
              
        open v_rc for select xtxx,xtbm from xtbm where xtbm in(listports);
        
        --open v_rc for select xtxx,xtbm from xtbm where xtbm in('ZY0101','ZY0102');  loop
       fetch v_rc into theSlot,theRate;
       exit when v_rc%notfound;
       dbms_output.put_line(theSlot || '  ***** ' ||  theRate);       
   end loop;
   close v_rc;END testts;

解决方案 »

  1.   

    就是传参数(参数指定为'ZY0101','ZY0102')时open v_rc for select xtxx,xtbm from xtbm where xtbm in(listports); 游标v_rc 取不到值;
    但如果静态指定open v_rc for select xtxx,xtbm from xtbm where xtbm in('ZY0101','ZY0102'); 就可以获取到值;
    费解,希望高手指点迷津
      

  2.   

    因为当参数传入时sql会认为这是一个完整的值,而不是分成两个值,效果如下:
    open v_rc for select xtxx,xtbm from xtbm where xtbm in(' ''ZY0101'',''ZY0102'' ');所以在传入后你需要处理下试试下面这个:
    open v_rc for select xtxx,xtbm from xtbm 
    where xtbm in (select substr( ','||listports, rownum, instr(','||listports,',',rownum+1) - instr(','||listports,',',rownum) - 1)
    from dual connect by rownum <= length(listports) - length(replace(listports,',','')) + 1);
      

  3.   

    open v_rc for select xtxx,xtbm from xtbm 
    where xtbm in (select substr( ','||listports, instr(','||listports,',',rownum), instr(','||listports,',',rownum+1) - instr(','||listports,',',rownum) - 1) 
    from dual connect by rownum <= length(listports) - length(replace(listports,',','')) + 1);上面有点问题,这个应该可以了,家里没oracle没法测试
      

  4.   

    rownum <=
    改为
    rownum <
      

  5.   

    open v_rc for 后面要加字符串的。open v_rc for 'select xtxx,xtbm from xtbm where xtbm in('||listports||')'; 表红色的是有值的因此要把它写到这里, 写成上面这个样子的时候,你的参数要传入如下形式
    '''ZY0101'',''ZY0102'''