我有一个输出为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
答案 0 :(得分:1)
在此期间,我找到了解决方案。
我添加了一个新类型和一个变量:
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;
答案 1 :(得分:0)
您可以使用动态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;