在存储过程里,有如下代码
........................
l_productstr := '(' || chr(39) || '10000024' || chr(39) || ')';insert into t_test1
select * from t_productinfo where pi.productcode in l_productstr;
........................运行的时候,没有数据插入到表 t_test1中去;
但是如果改成:
..............................
select * from t_productinfo where pi.productcode in ('10000024');
..............................
就可以有数据插入到t_test1中去;到底是咋回事情呢?
在线等待。btw:
至于为啥要用l_productstr,因为我的存储过程里面用的是动态的,而且是多个组合的productcode。

解决方案 »

  1.   

    select '''a''' from emp
    输出'a'
      

  2.   

    谢谢楼上的答复。不过你的答案似乎不太准确。
    再加上一些代码吧,这样看起来更准确些。
    .................
     open c_favcycleproduct;
      loop
        fetch c_favcycleproduct
          into l_productcode;
        exit when c_favcycleproduct%notfound;
      
        l_productstr := l_productstr || chr(39) || l_productcode || chr(39) || ',';
        --l_productstr := l_productstr || l_productcode || ',';
      end loop;
      close c_favcycleproduct;
    ...................
    insert into t_test1
    select * from t_productinfo where pi.productcode in l_productstr; 
    ...................
      

  3.   

    --应该可以的吧,看这个SQL> set serveroutput on;SQL>
    DECLARE
      in_str  VARCHAR2(4000);
      v_ename VARCHAR2(30);
    BEGIN
      in_str := '(' || chr(39) || 'WARD' || chr(39) || ')';
      EXECUTE IMMEDIATE 'select t.ename  from emp t where t.ename in ' || in_str
        INTO v_ename;
      dbms_output.put_line(v_ename);
    END;
    /WARD
     
    PL/SQL procedure successfully completed
     
    SQL> 
      

  4.   

    可能是你循环拼接得不对,
    你拼完以后,可以打出来看一下你的SQL对不对
      

  5.   

    to tangren:
    循环没问题,这个可以放心。我测试过的。
    奇怪的地方在于循环后的结果,拿出来单独执行查询,是可以的。
    但在存储过程里面执行就找不到结果。
    所以我怀疑是单引号的问题。
      

  6.   

    在多发点代码吧,看的更清楚些。
     open c_favcycleproduct;
      loop
        fetch c_favcycleproduct
          into l_productcode;
        exit when c_favcycleproduct%notfound;
      
        l_productstr := l_productstr || ''''||l_productcode||'''' || ',';
        --l_productstr := l_productstr || l_productcode || ',';
        insert into t_subtype_pdt_fee
          (id, subtype, productcode, price)
          select rownum as num,
                 us.usertypeid,
                 l_productcode,
                 getSubTypeProductFee(us.usertypeid, l_productcode) bprice
            from t_usertypes us;
      end loop;
      close c_favcycleproduct;  l_tmpb := length(l_productstr);
      l_productstr := substr(l_productstr, 0, l_tmpb - 1) || ')';
      

  7.   

    当前登录的用户是表t_productinfo的拥有者吗?在存储过程中如果是通过角色赋予用户的权利有时是不起作用的 
      

  8.   

    用 execute immediate来执行insert。执行前先dbms_output.put_line把sql打出来看看duibudui?