Si vous avez des contraintes d'intégrité référentielle (clés étrangères), alors tronquer ne fonctionnera pas; vous ne pouvez pas tronquer la table parent si des tables enfants existent, même si les enfants sont vides. Le PL/SQL suivant (il n'est pas testé, mais j'ai déjà exécuté un code similaire) itère sur les tables, en désactivant toutes les clés étrangères, en les tronquant, puis en réactivant toutes les clés étrangères. Si une table dans un autre schéma a une contrainte RI sur votre table, ce script échouera.
set serveroutput on size unlimited
declare
l_sql varchar2(2000);
l_debug number := 1; -- will output results if non-zero
-- will execute sql if 0
l_drop_user varchar2(30) := '' -- set the user whose tables you're dropping
begin
for i in (select table_name, constraint_name from dba_constraints
where owner = l_drop_user
and constraint_type = 'R'
and status = 'ENABLED')
loop
l_sql := 'alter table ' || l_drop_user || '.' || i.table_name ||
' disable constraint ' || i.constraint_name;
if l_debug = 0 then
execute immediate l_sql;
else
dbms_output.put_line(l_sql);
end if;
end loop;
for i in (select table_name from dba_tables
where owner = l_drop_user
minus
select view_name from dba_views
where owner = l_drop_user)
loop
l_sql := 'truncate table ' || l_drop_user || '.' || i.table_name ;
if l_debug = 0 then
execute immediate l_sql;
else
dbms_output.put_line(l_sql);
end if;
end loop;
for i in (select table_name, constraint_name from dba_constraints
where owner = l_drop_user
and constraint_type = 'R'
and status = 'DISABLED')
loop
l_sql := 'alter table ' || l_drop_user || '.' || i.table_name ||
' enable constraint ' || i.constraint_name;
if l_debug = 0 then
execute immediate l_sql;
else
dbms_output.put_line(l_sql);
end if;
end loop;
end;
/
Non seulement le plus facile, mais s'il y a une quantité de données dans ces tableaux, alors ce serait la méthode la plus rapide aussi. – NotMe