我正在尝试构建一个脚本来删除数据库上的所有对象,因此,通过以下选择,构建一个执行过程将使数据库完全干净(无权删除数据库并再次创建它) 。首先删除所有序列,索引等,然后删除表。
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编译错误。 *动作:
您知道如何执行此操作吗?
答案 0 :(得分:4)
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;
/
答案 1 :(得分:2)
出于测试目的,我使用Scott的架构。一旦污染严重,我将删除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;
/