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

Fed*_* E. 2 oracle

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

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

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

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;
/
Run Code Online (Sandbox Code Playgroud)

但我得到:

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

知道如何执行此操作吗?

Gri*_*Dog 6

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;
/
Run Code Online (Sandbox Code Playgroud)