通过plsql代码循环访问多个表

时间:2019-04-17 20:28:33

标签: oracle plsql

主表每天都要用来自两个表中两个源的输入数据进行更新。除了表名外,用于处理两个表的plsql代码实际上是相同的。我们必须分别记录有关输入表中数据的可能错误,因此必须为两个输入表分别运行一次代码。

尝试的解决方案是将表名放入变量中,并在代码中循环两次:

declare
   input_table varchar2(20);
begin
   for i in (select column_value as var from table(sys.ODCIvarchar2List('MIDGETS', 'GIANTS'))) loop
      if i.var = 'MIDGETS' then
         input_table := 'midget_table';
      elsif i.var = 'GIANTS' then
         input_table := 'giant_table';
      end if;

      for rec in (select col1, col2 from input_table) loop

         <the processing code>

      end loop;
end;
/

问题是plsql似乎不知道input_table是变量。它“认为” input_table 实际上是表的名称,并返回(ORA-00942:表或视图不存在)错误。

由于这是动态代码,因此尝试了EXECUTE IMMEDIATE:

declare
   input_table varchar2(20);
begin
   for ... 'MIDGETS', 'GIANTS' ... loop
      input_table := ...
      ...
   end loop;

   for rec in ( EXECUTE IMMEDIATE 'select col1, col2 from ' || input_table ) loop
      <processing>
   end loop;
end;
/

但是在这种情况下也不允许立即执行。

有没有办法?还是要制作.sql文件的两个副本,一个用于MIDGETS,一个用于GIANTS,这是唯一的出路?

1 个答案:

答案 0 :(得分:2)

您可以按以下方式使用动态查询

declare
   type crs_type is ref cursor;
   c crs_type;
   v_query     varchar2(2000);
   input_table varchar2(20);
   v_col1      midgets.col1%type; -- assuming identical data types for common named columns
   v_col2      midgets.col2%type;
begin
   for ... 'MIDGETS', 'GIANTS' ... loop
      input_table := ...
      ...
   end loop;


   v_query := 'select col1, col2 from ' || input_table;
   open c for v_query;
   loop
    fetch c into v_col1, v_col2;
    exit when c%notfound;
      <processing>
   end loop;
   close c;
end;