Il y a plusieurs façons de le faire. D'abord, vous pouvez utiliser un bloc anonyme avec une table imbriquée des instructions ou un tableau associatif des instructions. L'approche de la table imbriquée nécessite un peu moins de changements dans votre script existant, mais il y a un risque que les numéros ne soient pas en séquence. Notez que j'utilise le mécanisme de citations alternatif, par ex. q '[character] ... [character]', juste au cas où votre DDL contient des apostrophes.
Ce code est similaire à certaines des autres réponses, mais avec la syntaxe Oracle et ne nécessite pas la création d'objets supplémentaires.
script table imbriquée:
--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;
/
script tableau Associatif:
--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;
/
Si vous êtes à la recherche d'une façon de garder votre script presque identique à sa forme actuelle, une autre approche serait de exécuter le script entier et avoir un bloc anonyme à la fin qui supprime les tables indésirables. Cela maintient le début de votre script très simple, mais il peut évidemment y avoir quelques soucis avec la suppression automatique des tables.
--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;
/
Est-ce que ce doit être un fichier .sql? Ou pouvez-vous utiliser un script shell - parce que cela semble être l'approche la plus simple pour moi. – Benubird