2009-11-08 3 views

ответ

0

Нет необходимости в переменных

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

С уважением K

+2

-1 Не обращается к необходимости обрабатывать ограничения – 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

Вы можете вывести, а затем выполнить понравившийся:

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

Улучшение в случае, если вы имеете специальные ограничения которые превышают сценарий:

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

К сожалению, ограничения ограничены по порядку. вы можете исправить деактивацию ограничений, добавив «каскад» в конце команды «disable». , но, скорее всего, вы не сможете автоматизировать активацию ограничений. – mmoossen

3

Улучшен указанный выше сценарий, если вы не можете удалить ограничение, поскольку существуют зависимости (в виде внешних ключей, которые зависят от этого ограничения - ORA-02297.) И путем печати всех (отключить, усечь и включить).

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; 
Смежные вопросы