I am using oracle DB to maintain more than 30 tables, how can I delete all the data from all the tables? I only want to delete the data but not drop the tables.
I created this stored proc, using the answers mentioned above. This works perfectly without any errors or exceptions.
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;
Generate a script to truncate (= remove all rows from) all tables:
select 'truncate table ' || table_name || ';' from user_tables
And then execute the script.
The potential drawback with a truncate is that it may fail on referential integrity constraints. So you'd want to disable foreign key constraints first, then do the truncate, then re-enable constraints. The 'plus' with cloning the schema (exp and imp) is that you could also drop and recreate the tablespace too (which you may want to do if you want to reclaim some physical disk space as a result of removing all the data).