如何构建动态字符串PLSQL

时间:2017-01-20 08:54:03

标签: oracle dynamic plsql

我有两个关联数字的associative_arrays,我正在尝试为动态查询构建一个动态字符串。

这是我的陈述:

    for indx_opt in 1..IDOPTarray.count loop

         IF indx_opt=1 AND IDFGCFCParray.count=1 THEN
         sql_stmt_2:=sql_stmt_2||' and wopt.id_ft_opt = ';
         sql_stmt_2:=sql_stmt_2|| (IDOPTarray(indx_opt));
         end if;

         if indx_opt=1  AND  IDFGCFCParray.count>1 then
         sql_stmt_2:=sql_stmt_2||' and wopt.id_ft_opt in(';
         sql_stmt_2:=sql_stmt_2||(IDOPTarray(indx_opt));

         elsif indx_opt>=1 AND IDFGCFCParray.count>=0 then
         sql_stmt_2:=sql_stmt_2||','||(IDOPTarray(indx_opt))||')';

IDOPTarray中有2个数字我得到了正确的结果:

    and wopt.id_ft_opt in(27,28)

在IDOPTarray中使用多于2个数字,我得到了这个结果:

    ,17228),17229),17230)

我想得到的是:

     where w.id = 303 and wopt.id_ft_opt in (17228,17229,17230)

如果我有5个数字,我想在'where'子句中得到这个:

     where w.id = 321 and wopt.id_ft_opt in (17228,17229,17230,17231,17232)

我想要一个动态输出我的字符串。

IDFGCFCP​​array是第二个数组,但现在不重要,以获得我想要的输出。

有人可以帮助我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

只有当indx_opt等于IDOPTarray.count时,才必须关闭括号。 简单的例子。

declare 
 type  list_number is table of number;
  xx list_number := new list_number(1,2,3,5,7,8);
  str varchar2(4000);
begin 

 for i in xx.first .. xx.last loop
  if i = 1 then 
    str := ' condition in ('||xx(i);
  else 
    str := str||','||xx(i);
  end if;

   if i = xx.last then 
   str := str||')';
   end if; 
 end loop;
dbms_output.put_line(str);
end;  

如果你的colleciton是sql levle类型,你可以这样做

declare 
  xx list_number := new list_number(1,2,3,5,7,8);
  str varchar2(4000);
begin 
 SELECT  'condition in ('||LISTAGG(column_value, ',') WITHIN GROUP (ORDER BY column_value)||')' into str from table(xx);
 dbms_output.put_line(str); 
end;