首页 文章

删除Oracle中架构上的所有对象

提问于
浏览
1

我正在尝试构建一个脚本来删除数据库上的所有对象,因此使用以下选择,构建一个执行的过程将使数据库完全清理(没有权限删除数据库并再次创建它) . 首先删除所有序列,索引等,然后删除表 .

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

考虑到这一点,我认为这样的事情可以起作用:

BEGIN

    FOR i IN (select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX'))
    LOOP
        EXECUTE IMMEDIATE i;
    END LOOP;

END;
/

但我得到:

错误报告 - ORA-06550:第5行,第27列:PLS-00382:表达式类型错误ORA-06550:第5行第9列:PL / SQL:语句忽略06550. 00000 - “行%s,列% s:\ n%s“*原因:通常是PL / SQL编译错误 . *行动:

知道如何执行此操作吗?

2 回答

  • 4

    出于测试目的,我使用Scott的架构 . 一旦它被污染太严重,我就会放弃除斯科特的默认表之外的一切 . 这是我的剧本;看看它对你的情况有帮助 .

    请注意,您必须多次运行它,因为它不会考虑外键约束,这些约束不会让您在其详细信息存在时删除主表,但这并不会让我感到烦恼 .

    declare
      l_str varchar2(200);
    begin
      for cur_r in (select object_name, object_type From user_objects 
                    where object_name not in ('EMP', 'DEPT', 'BONUS', 'SALGRADE')
                   )
      loop
        begin
          l_str := 'drop ' || cur_r.object_type || ' '|| cur_r.object_name;
          dbms_output.put_Line(l_str);
          execute immediate l_str;
        exception
          when others then null;
        end;
      end loop;
    end;
    /
    
  • 2

    execute immediate 需要一个字符串(或varchar2)参数 . 你给它一个光标行 . 为您选择的值赋予别名并将其用作参数,并且不要在语句中包含分号,如下所示:

    begin
      for i in (select 'drop ' || object_type || ' ' || object_name as stmt
                  from user_objects
                 where object_type in ('VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')) loop
        execute immediate i.stmt;
      end loop;
    end;
    /
    

相关问题