2017-01-20 15 views
0

私は2のassociative_arraysをnumber持っており、動的クエリの動的文字列を作成しようとしています。動的文字列PLSQLを構築する方法

この文のための私です:

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) 

私が取得したいのはこれです:

私は5つの数字を持っている場合
 where w.id = 303 and wopt.id_ft_opt in (17228,17229,17230) 

は、私は「どこ」節のためにこれを取得したい:

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

私は、文字列の動的な出力をしたいです。

IDFGCFCP​​arrayは2番目の配列ですが、今のところ私が望む出力を得るためには重要ではありません。

誰かが私を助けることができますか?ありがとうございました。

答えて

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場合は、あなたがこのよう

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; 
+0

でこれを行うことができ、SQL levleタイプですありがとう、私はこのソリューションをしようとします。現時点では、if条件を変更するだけで問題を解決できると思う –

関連する問題