我正在尝试构建一个脚本来删除数据库上的所有对象,因此使用以下选择,构建一个执行的过程将使数据库完全清理(没有权限删除数据库并再次创建它) . 首先删除所有序列,索引等,然后删除表 .
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 回答
出于测试目的,我使用Scott的架构 . 一旦它被污染太严重,我就会放弃除斯科特的默认表之外的一切 . 这是我的剧本;看看它对你的情况有帮助 .
请注意,您必须多次运行它,因为它不会考虑外键约束,这些约束不会让您在其详细信息存在时删除主表,但这并不会让我感到烦恼 .
execute immediate
需要一个字符串(或varchar2)参数 . 你给它一个光标行 . 为您选择的值赋予别名并将其用作参数,并且不要在语句中包含分号,如下所示: