一个从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就取出来了而且我已经测试过了,传过来的参数是正确的。
现在声明一个宿主变量接受参数后,在游标中的where子句的IN关键字中使用,如下
WHERE T1.PLAN_NO = T2.PLAN_NO
AND T1.PLAN_NO = :cplanno
AND TO_CHAR(T1.SEQ1) IN (:cselseql)可以这么用吗?我这么用怎么取不到数据(实际上是有的),当我把:cselseql换成常量,比如:1,2就取出来了而且我已经测试过了,传过来的参数是正确的。
=in('1,2')
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 ...;
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
如果是我的话,我就建立一个临时表,比如叫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)
就搞定了,可以做到你要做的事情,也没什么技术难度
WHERE T1.PLAN_NO = T2.PLAN_NO
AND T1.PLAN_NO = :cplanno
AND INSTR(',' || :cselseql || ',', ',' || TO_CHAR(T1.SEQ1) || ',') > 0