PL / SQL遍历变量

时间:2019-03-25 08:51:23

标签: oracle plsql


我有一个输出为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

2 个答案:

答案 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;