我有两个关联数字的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)
我想要一个动态输出我的字符串。
IDFGCFCParray是第二个数组,但现在不重要,以获得我想要的输出。
有人可以帮助我吗?谢谢。
答案 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;