2009-11-08 21 views

Respuesta

0

No hay necesidad para las variables

begin 
    for r in (select table_name from user_tables) loop 
    execute immediate 'truncate table ' || r.table_name; 
    end loop; 
end; 

Saludos K

+2

-1 No soluciona la necesidad de manejar restricciones – APC

6
declare 

begin 

for c1 in (select table_name, constraint_name from user_constraints) loop 
    begin 
     execute immediate ('alter table '||c1.table_name||' disable constraint '||c1.constraint_name); 
    end; 
end loop; 

for t1 in (select table_name from user_tables) loop 
    begin 
     execute immediate ('truncate table '||t1.table_name); 
    end; 
end loop; 

for c2 in (select table_name, constraint_name from user_constraints) loop 
    begin 
     execute immediate ('alter table '||c2.table_name||' enable constraint '||c2.constraint_name); 
    end; 
end loop; 

end; 
/
0

Puede salida, a continuación, ejecutar el que más le guste:

set serveroutput on; 

begin 

for r in (select table_name from user_tables) loop 

    dbms_output.put_line('truncate table ' || r.table_name); 

    end loop; 

end; 
2

Mejora en caso de tener restricciones especiales que hacen que la secuencia de comandos anterior falle:

set serveroutput on; 

declare 

begin 

for c1 in (select y.table_name, y.constraint_name from user_constraints y, user_tables x where x.table_name = y.table_name) loop 
    begin 
     dbms_output.put_line('alter table '||c1.table_name||' disable constraint '||c1.constraint_name || ';'); 
     execute immediate ('alter table '||c1.table_name||' disable constraint '||c1.constraint_name); 
    end; 
end loop; 

for t1 in (select table_name from user_tables) loop 
    begin 
     execute immediate ('truncate table '||t1.table_name); 
    end; 
end loop; 

for c2 in (select table_name, constraint_name from user_constraints) loop 
    begin 
     execute immediate ('alter table '||c2.table_name||' enable constraint '||c2.constraint_name); 
    end; 
end loop; 

end; 
/
+1

lamentablemente las restricciones están 'restringidas' por orden. puede corregir la desactivación de las restricciones agregando 'cascade' al final del comando 'disable'. pero lo más probable es que no pueda automatizar la activación de las restricciones. – mmoossen

3

Se mejoró la secuencia de comandos anterior en caso de que no se pueda eliminar la restricción porque existen dependencias (en forma de claves foráneas que dependen de esta restricción - ORA-02297) e imprimiendo todas (deshabilitar, truncar y habilitar) declaraciones.

set serveroutput on; 

declare 

begin 

for c1 in (select y1.table_name, y1.constraint_name from user_constraints y1, user_tables x1 where x1.table_name = y1.table_name order by y1.r_constraint_name nulls last) loop 
    begin 
     dbms_output.put_line('alter table '||c1.table_name||' disable constraint '||c1.constraint_name || ';'); 
     execute immediate ('alter table '||c1.table_name||' disable constraint '||c1.constraint_name); 
    end; 
end loop; 

for t1 in (select table_name from user_tables) loop 
    begin 
     dbms_output.put_line('truncate table '||t1.table_name || ';');  
     execute immediate ('truncate table '||t1.table_name); 
    end; 
end loop; 

for c2 in (select y2.table_name, y2.constraint_name from user_constraints y2, user_tables x2 where x2.table_name = y2.table_name order by y2.r_constraint_name nulls first) loop 
    begin 
     dbms_output.put_line('alter table '||c2.table_name||' enable constraint '||c2.constraint_name || ';');   
     execute immediate ('alter table '||c2.table_name||' enable constraint '||c2.constraint_name); 
    end; 
end loop; 

end; 
Cuestiones relacionadas