Есть несколько способов сделать это.Во-первых, вы можете использовать анонимный блок с вложенной таблицей операторов или ассоциативным массивом операторов.Подход с использованием вложенных таблиц требует немного меньших изменений в существующем сценарии, но существует риск того, что числа выйдут из последовательности.Обратите внимание, что я использую альтернативный механизм цитирования, например, q '[символ] ... [символ]', на тот случай, если ваш DDL содержит некоторые апострофы.
Этот код похож на некоторые другие ответы, но с синтаксисом Oracle и не требует создания дополнительных объектов.
Сценарий вложенной таблицы:
--Only create the tables between the two values (nested table)
declare
type varchar_tab is table of varchar2(32767);
table_statements varchar_tab := varchar_tab(
q'!create table tab1 (test1 number)!',
q'!create table tab2 (test1 number)!',
q'!create table tab3 (test1 number)!',
q'!create table tab4 (test1 number)!'
);
begin
for i in &1 .. &2 loop
execute immediate table_statements(i);
end loop;
end;
/
Сценарий ассоциативного массива:
--Only create the tables between the two values (associative array)
declare
type varchar_tab is table of varchar2(32767) index by number;
table_statements varchar_tab;
begin
table_statements(1) := q'!create table tab1 (test1 number)!';
table_statements(2) := q'!create table tab2 (test1 number)!';
table_statements(3) := q'!create table tab3 (test1 number)!';
table_statements(4) := q'!create table tab4 (test1 number)!';
--Only create the tables between the two values
for i in &1 .. &2 loop
execute immediate table_statements(i);
end loop;
end;
/
Если выВ поисках способа сохранить ваш сценарий практически идентичным его текущей форме, другой подход будет состоять в том, чтобы запустить весь сценарий и затем иметь в конце анонимный блок, который удаляет ненужные таблицы.Это делает верх вашего скрипта действительно простым, но, очевидно, могут возникнуть некоторые проблемы с автоматическим удалением таблиц.
--Drop all the tables except for those within the range
declare
table_does_not_exist exception;
pragma exception_init(table_does_not_exist, -00942);
begin
for i in 1 .. 1000 loop
if i between &1 and &2 then
null;
else
begin
execute immediate 'drop table tab'||i;
exception when table_does_not_exist then null;
end;
end if;
end loop;
end;
/