2016-11-20 73 views
1

如果我正在执行下面的查询,它会给我4个正确的记录。Oracle:通过存储过程在查询中传递动态字符串

select SUBSCRIBER_NUM, SUBSCRIBER_STATUS, P_ID 
from C_S_FORWARD_INFO 
where SUBSCRIBER_NUM IN ('0', '07', '070', '0705', '07052', '070526', '0705262', '07052620') and 
     SCP_VER = 1 

但是当我在下面执行时,它给了我0条记录。实际上,我必须动态传递查询中'IN'部分的值。

我试过下面(VAR_CALLING_NUM = 07052620):

while var1<=len LOOP 
temp1 := SUBSTR(VAR_CALLING_NUM, 1, var1); 
temp1 := concat('''',temp1); 
temp1 := concat(temp1,''''); 
temp6 := temp6 || temp1 || ',' ; 
var1:=var1+1; 
END LOOP; 
temp6 := SUBSTR(temp6, 1,length(temp6)-1); 

select SUBSCRIBER_NUM, SUBSCRIBER_STATUS, P_ID from C_S_FORWARD_INFO where SUBSCRIBER_NUM IN (temp6) and SCP_VER = 1 order by length(subscriber_num) desc; 

这是为什么givign我0的记录。我做错了什么,通过传递临时temp6查询如SUBSCRIBER_NUM IN (temp6)

+0

你有一个循环代码,所以它是PL/SQL。在PL/SQL中,你可以选择进入某个变量,而不仅仅是选择。你可以发布整个代码吗?或者只是描述你想在PL/SQL中做什么? – Kacper

回答

2

你有一个字符串,看起来像"'0', '07', . . ."。这是一个单独的字符串。它不被in解释为多个值。

您将需要使用动态SQL将其作为列表。这需要构建SQL,然后使用execute immediate

+0

感谢您的评论。 Actully我有一个调用存储过程的java代码。现在存储过程如此之大,我刚刚在这里展示了它的一部分。你能告诉我我该怎么做。 – VJS

+0

它可能存储变量中的单独值。类似于a1 = '07',a2 ='070',a3 ='0705',a4 ='07052',并从C_S_FORWARD_INFO中选择SUBSCRIBER_NUM,SUBSCRIBER_STATUS,P_ID,其中SUBSCRIBER_NUM IN(a1,a2,a3,a4,a5,a6, a7,a8)和SCP_VER = 1按长度排序(subscriber_num)desc; – VJS

+0

您的帮助请求先生 – VJS

相关问题