一个从VC中传过来的,用逗号区分的参数比如:1,2,3。
现在声明一个宿主变量接受参数后,在游标中的where子句的IN关键字中使用,如下
WHERE T1.PLAN_NO = T2.PLAN_NO
AND T1.PLAN_NO = :cplanno
AND TO_CHAR(T1.SEQ1) IN (:cselseql)可以这么用吗?我这么用怎么取不到数据(实际上是有的),当我把:cselseql换成常量,比如:1,2就取出来了而且我已经测试过了,传过来的参数是正确的。

解决方案 »

  1.   

    你传进去的是一个字符串,估计需要使用动态sql才可以
      

  2.   

    对oracle 来讲 :cselseql 是一个值,一个字符串
    =in('1,2')
      

  3.   

    多谢,NinGoo,PowerPort,wxmaizi的回答,错误我大概知道了,但是Pro*C我很陌生,能告诉我具体应该怎么解决吗?比如这种情况要如何使用动态sql
      

  4.   

    sprintf(v_sqlString,"select * from T1,T2 WHERE T1.PLAN_NO = T2.PLAN_NO AND T1.PLAN_NO = %d AND TO_CHAR(T1.SEQ1) IN (%s)",cplanno,cselseql);
    exec sql prepare pre_cursor from :v_sqlString;
    if(sqlca.sqlcode<0)
    {
      printf("声明游标出错 :sqlca.sqlcode=%d\n",sqlca.sqlcode);
    return;
    }
    exec sql declare cursor_test cursor for pre_cursor;
    if(sqlca.sqlcode<0)
    {
      printf("定义游标出错 :sqlca.sqlcode=%d\n",sqlca.sqlcode);
         return;
    }
    exec sql open cursor_test;
    exec sql fetch cursor_test into ...;
      

  5.   

    WHERE T1.PLAN_NO = T2.PLAN_NO
    AND T1.PLAN_NO = :cplanno
    AND TO_CHAR(T1.SEQ1) IN (:cselseql)------------------------WHERE T1.PLAN_NO = T2.PLAN_NO
    AND T1.PLAN_NO = :cplanno
    AND INSTR(:cselseql,TO_CHAR(T1.SEQ1))>0
      

  6.   

    你的问题比较复杂,确实不容易处理
    如果是我的话,我就建立一个临时表,比如叫A
    它只有一个字段就可以了,比如叫id
    然后你把cselseql用c处理拆开,比如1,2拆成2个ID,在表A中填入2行数据
    一个是1,一个是2
    再把你的sql改成
    WHERE T1.PLAN_NO = T2.PLAN_NO
    AND T1.PLAN_NO = :cplanno
    AND TO_CHAR(T1.SEQ1) IN (select id from a)
    就搞定了,可以做到你要做的事情,也没什么技术难度
      

  7.   

    谢谢各位高手的指点,这个问题才得以解决,我最终采用了feng2(蜀山风云) 的方法,但是有点改动,写下来供大家参考。
    WHERE T1.PLAN_NO = T2.PLAN_NO
    AND T1.PLAN_NO = :cplanno
    AND INSTR(',' || :cselseql || ',', ',' || TO_CHAR(T1.SEQ1) || ',') > 0