Use the following script to drop all objects in a specific schema in an Oracle Database without droping the schema itself. It saves you from recreating the schema, its associated user, its rights, etc.

create script file

Create a file called empty_user.sql with the following content:

purge recyclebin;
declare
    -- FK first, then unique, then PK
    cursor cursor_constraints is select table_name, constraint_name
                          from user_constraints
                         where constraint_type in ('P', 'R', 'U')
                        order by decode(constraint_type, 'R', 0, 'U', 1, 'P', 2, 3);
    cursor cursor_mviews is select mview_name from user_mviews;
    cursor cursor_views is select view_name from user_views;
    cursor cursor_mviews_logs is select master from user_mview_logs;
    cursor cursor_tables is select table_name from user_tables;
    cursor cursor_synonyms is select synonym_name from user_synonyms;
    cursor cursor_sequences is select sequence_name from user_sequences;
begin
    for current_val in cursor_constraints
    loop
        execute immediate 'alter table ' || current_val.table_name || ' drop constraint ' || current_val.constraint_name;
    end loop;
    for current_val in cursor_mviews
    loop
        execute immediate 'drop materialized view ' || current_val.mview_name;
    end loop;
    for current_val in cursor_views
    loop
        execute immediate 'drop view ' || current_val.view_name;
    end loop;
    for current_val in cursor_mviews_logs
    loop
        execute immediate 'drop materialized view log on ' || current_val.master;
    end loop;
    for current_val in cursor_tables
    loop
        execute immediate 'drop table ' || current_val.table_name || ' purge';
    end loop;
    for current_val in cursor_synonyms
    loop
        execute immediate 'drop synonym ' || current_val.synonym_name;
    end loop;
    for current_val in cursor_sequences
    loop
        execute immediate 'drop sequence ' || current_val.sequence_name;
    end loop;
end;
/
quit

line with "/" is required to execute the preceding PL/SQL procedure line with "quit" is usefull to automatically exit sqlplus when procedure has been executed

Execute with sqlplus

sqlplus user/user_pwd @empty_user.sql

You can expect output such as the following:

my_machine:$ sqlplus user/user_pwd @empty_user.sql

SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 14 12:27:32 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options


Recyclebin purged.


PL/SQL procedure successfully completed.

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

Credits

The origin of the above script is one largely used at Ekino to which multiple developers (including myself) contributed.


Published

Category

tips

Tags

Contact