【发布时间】:2019-04-17 20:28:33
【问题描述】:
主表每天都会使用来自两个表中的两个来源的输入数据进行更新。处理这两个表的 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: table or view does not exist) 错误。
由于这是动态代码,因此尝试了 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;
/
但是在这种情况下,EXECUTE IMMEDIATE 也是不允许的。
有办法吗?还是将 .sql 文件复制两份,一份给 MIDGETS,一份给 GIANTS,这是唯一的出路?
【问题讨论】: