ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【Script】使用PL/SQL快速清理当前用户下所有数据库对象

【Script】使用PL/SQL快速清理当前用户下所有数据库对象

原创 Linux操作系统 作者:secooler 时间:2011-03-21 22:38:47 0 删除 编辑
我们在平时的应用开发及数据库环境准备的过程中,经常会遇到清理当前用户下数据库对象的需求,以便满足数据库环境准备。
本文给出一种使用PL/SQL实现清理当前用户下数据库对象的方法。

【提别提醒】:由于脚本中涉及到DROP这种危险的DDL命令,千万不要在生产环境及系统用户(SYSTEM及SYS用户等)下进行尝试!

1.环境准备
这里模拟创建表、视图以及同名。
sec@ora11g> create table t1 (x int);

Table created.

sec@ora11g> create table t2 (x int);

Table created.

sec@ora11g> create view v_t1 as select * from t1;

View created.

sec@ora11g> create view v_t2 as select * from t2;

View created.

sec@ora11g> create synonym syn_t1 for t1;

Synonym created.

sec@ora11g> create synonym syn_t2 for t2;

Synonym created.

sec@ora11g> select OBJECT_NAME,OBJECT_TYPE from obj order by CREATED;

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
T1                             TABLE
T2                             TABLE
V_T1                           VIEW
V_T2                           VIEW
SYN_T1                         SYNONYM
SYN_T2                         SYNONYM

6 rows selected.

OK,具有三种数据库对象的sec用户准备完毕,此处为每一种数据库对象创建了多个。

2.准备清理当前用户数据库对象的PL/SQL脚本
由于脚本结构和内容均比较简单,不进行注释。具体脚本内容如下。
DECLARE

CURSOR l_tables IS
  select table_name from user_tables;
CURSOR l_views IS
  select view_name from user_views;
CURSOR l_synonyms IS
  select synonym_name from user_synonyms;

BEGIN

-- drop tables
  FOR rec_tables IN l_tables LOOP
    dbms_output.put_line('Dropping table ' || rec_tables.table_name  );

    BEGIN
      EXECUTE IMMEDIATE 'DROP TABLE ' || rec_tables.table_name;
    EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Unable to drop table ' || rec_tables.table_name);
    END;

  END LOOP;

-- drop views
  FOR rec_views IN l_views LOOP
    dbms_output.put_line('Dropping view ' ||  rec_views.view_name);

    BEGIN
      EXECUTE IMMEDIATE 'DROP VIEW ' || rec_views.view_name;
    EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Unable to drop view ' ||  rec_views.view_name);
    END;

  END LOOP;

-- drop synonyms
  FOR rec_synonyms IN l_synonyms LOOP
    dbms_output.put_line('Dropping synonym ' || rec_synonyms.synonym_name);

    BEGIN
      EXECUTE IMMEDIATE 'DROP SYNONYM ' || rec_synonyms.synonym_name;
    EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Unable to drop synonym ' || rec_synonyms.synonym_name);
    END;

  END LOOP;

END;
/

3.执行效果验证
1)执行脚本过程中的输出信息
Dropping table T1
Dropping table T2
Dropping view V_T1
Dropping view V_T2
Dropping synonym SYN_T1
Dropping synonym SYN_T2

PL/SQL procedure successfully completed.

如果在删除的过程中出现问题,这里也会给出简单的报错提示。

2)测试脚本执行效果
sec@ora11g> select OBJECT_NAME,OBJECT_TYPE from obj order by CREATED;

no rows selected

可见,当前sec用户下的表、视图以及同名清理完毕。

4.小结
这里给出的仅仅是删除当前用户下表、视图以及同名的PL/SQL脚本。根据具体的环境,可以按照脚本的结构自行定制。
满足实际需求的脚本才是有价值的,毫无目的性的脚本编写皆为虚无!

Good luck.

secooler
11.03.20

-- The End --

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-690110/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE 总监,阿里云MVP,北京大学理学硕士,恩墨学院创始人,教育专家,中国区 Cloudera 首位官方授权大数据讲师,金牌培训专家,BDA大数据联盟创始人,OCM联盟创始人,ACCUG创始人、ACOUG核心专家,Blogger。

注册时间:2008-03-16

  • 博文量
    797
  • 访问量
    8091668