我有一个工具,其输出是一个SQL查询结果。根据用户选择,查询使用子查询。为了让所有子查询到我的最终查询,我使用字符串,在最后阶段我将它们连接到一个大查询 - vSQL
。
子查询保存在字符串中,如vSQL1
.. vSQL14
因为不是每个子查询都被使用 - 用户选择 - 其中一些被省略。
现在它看起来像这样:
if LENGTH(vSQL1) > 1 then
set_vSQL(vSQL, vSQL1, t);
end if;
..
if LENGTH(vSQL14) > 1 then
set_vSQL(vSQL, vSQL14, t);
end if;
是否可以将其置于循环中以便只变量会发生变化? 我试过这样的事情,但这不起作用。
for x in 1 .. 14
loop
if LENGTH(vSQL || x) > 1 then
set_vSQL(vSQL, vSQL || x, t);
end if;
end loop
与此同时,我找到了一个解决方案。
我添加了一个新类型和一个变量:
TYPE vSQLs_table IS TABLE OF VARCHAR2(32000);
vSQLs vSQLs_table;
有了这个,我可以将所有变量输入到一个:
vSQLs := vSQLS_table(vSQL1, vSQL2, vSQL3, vSQL4, vSQL5, vSQL6, vSQL7, vSQL8, vSQL9, vSQL10, vSQL11, vSQL12);
有了这个,我可以遍历所有这些:
for x in 1 .. 12
loop
if LENGTH(vSQLs(x)) > 1 then
set_vSQL(vSQL, vSQLs(x), t);
end if;
end loop;
您可以使用动态SQL。类似的东西(代码没有经过测试)
declare
l number;
begin
for x in 1 .. 14
loop
execute immediate 'select LENGTH(vSQL'||to_char(x)||') from dual' into l;
if l > 1 then
execute immediate 'set_vSQL(vSQL, vSQL'||to_char(x)||', t)' ;
end if;
end loop
end;