Ответ 1
Создайте script, чтобы обрезать (= удалить все строки из) всех таблиц:
select 'truncate table ' || table_name || ';' from user_tables
И затем выполните script.
Я использую Oracle для поддержки более 30 таблиц, как я могу удалить все данные из всех таблиц? Я хочу только удалить данные, но не отбрасывать таблицы.
Создайте script, чтобы обрезать (= удалить все строки из) всех таблиц:
select 'truncate table ' || table_name || ';' from user_tables
И затем выполните script.
Нет команды "ALTER TABLE XXX DISABLE ALL CONSTRAINTS"
Я предлагаю это:
BEGIN
FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
LOOP
EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' disable constraint ' || c.constraint_name);
END LOOP;
FOR c IN (SELECT table_name FROM user_tables)
LOOP
EXECUTE IMMEDIATE ('truncate table ' || c.table_name);
END LOOP;
FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
LOOP
EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' enable constraint ' || c.constraint_name);
END LOOP;
END;
Чтобы решить проблему ограничений, должно получиться что-то вроде этого:
BEGIN
FOR T in (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS';
END LOOP;
FOR T in (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
END LOOP;
FOR T in (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS';
END LOOP;
END;
Потенциальный недостаток с усечением заключается в том, что он может терпеть неудачу при ограничениях ссылочной целостности. Таким образом, вы хотите сначала отключить внешние ограничения ключей, затем выполнить усечение, а затем снова включить ограничения. "Плюс" с клонированием схемы (exp и imp) заключается в том, что вы также можете отбросить и воссоздать табличное пространство (что вы, возможно, захотите сделать, если хотите восстановить некоторое физическое дисковое пространство в результате удаления всех данных).
Клонировать схему, а затем отбросить старые таблицы?
Я создал эту сохраненную процедуру, используя ответы, упомянутые выше. Это отлично работает без каких-либо ошибок или исключений.
create or replace PROCEDURE DELETE_ALL_DATA
AS
cursor r1 is select * from user_constraints;
cursor r2 is select * from user_tables;
cursor r3 is select * from user_constraints;
cursor r4 is select * from user_tables;
BEGIN
FOR c1 IN r1
loop
for c2 in r2
loop
begin
if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN
dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name);
end if;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
continue;
WHEN OTHERS
THEN
continue;
end;
end loop;
END LOOP;
FOR T in (SELECT table_name FROM user_tables) LOOP
begin
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
continue;
WHEN OTHERS
THEN
continue;
end;
END LOOP;
FOR c1 IN r3
loop
for c2 in r4
loop
begin
if c1.table_name = c2.table_name and c1.status = 'DISABLED' THEN
dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' enable constraint ' || c1.constraint_name);
end if;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
continue;
WHEN OTHERS
THEN
continue;
end;
end loop;
END LOOP;
commit;
END DELETE_ALL_DATA;
Удалить все данные из всех таблиц в oracle
DECLARE str VARCHAR2(100); BEGIN FOR i IN (SELECT object_name FROM user_objects WHERE object_type='TABLE' ) LOOP str := 'Truncate table '|| i.object_name; EXECUTE IMMEDIATE str; DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name); END LOOP; END;
За дополнительной информацией: http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html
эти две строки script являются лучшими
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO