Основная таблица должна обновляться ежедневно с использованием входных данных из двух источников в двух таблицах. Код 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;
/
Но EXECUTE IMMEDIATE также не разрешен в этом контексте.
Есть ли способ вообще? Или единственный выход - сделать две копии файла .sql, одну для MIDGETS и одну для GIANTS?