sql - 在Oracle中删除所有用户表/序列

标签 sql oracle plsql build-process oracle11g

作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。

我的脚本创建了一个过程来删除表/序列,执行该过程,然后删除该过程。我正在从sqlplus执行文件:

drop.sql:


create or replace procedure drop_all_cdi_tables
is
cur integer;
begin
cur:= dbms_sql.OPEN_CURSOR();
for t in (select table_name from user_tables) loop
execute immediate 'drop table ' ||t.table_name|| ' cascade constraints';
end loop;
dbms_sql.close_cursor(cur);

cur:= dbms_sql.OPEN_CURSOR();
for t in (select sequence_name from user_sequences) loop
execute immediate 'drop sequence ' ||t.sequence_name;
end loop;
dbms_sql.close_cursor(cur);
end;
/
execute drop_all_cdi_tables;
/
drop procedure drop_all_cdi_tables;
/

不幸的是,删除该过程会导致问题。似乎会导致争用情况,并且该过程在执行之前已被删除。
例如。:

SQL * Plus:版本11.1.0.7.0-2010年3月30日星期二18:45:42投入生产

版权所有(c)1982、2008,Oracle。版权所有。

连接到:
Oracle Database 11g企业版11.1.0.7.0版-64位生产
使用分区,OLAP,数据挖掘和实际应用程序测试选项

过程已创建。

PL / SQL过程成功完成。

过程已创建。

程序已放弃。

删除过程drop_all_user_tables
*
第1行发生错误:
ORA-04043:对象DROP_ALL_USER_TABLES不存在

SQL>与Oracle Database 11g企业版11.1.0.7.0版断开连接-64
使用分区,OLAP,数据挖掘和实际应用程序测试选项

关于如何使它工作的任何想法?

最佳答案

如果您不打算保留存储过程,则可以使用anonymous PLSQL block:

BEGIN

  --Bye Sequences!
  FOR i IN (SELECT us.sequence_name
              FROM USER_SEQUENCES us) LOOP
    EXECUTE IMMEDIATE 'drop sequence '|| i.sequence_name ||'';
  END LOOP;

  --Bye Tables!
  FOR i IN (SELECT ut.table_name
              FROM USER_TABLES ut) LOOP
    EXECUTE IMMEDIATE 'drop table '|| i.table_name ||' CASCADE CONSTRAINTS ';
  END LOOP;

END;

关于sql - 在Oracle中删除所有用户表/序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2549718/

相关文章:

sql - 如何从表中获取第二大或第三大条目

oracle - 从过程中调用带有表参数的函数时出现编译错误

sql - postgreSQL 斐波那契数列 - 查询没有结果数据的目的地

sql - |DataDirectory| 在哪里定义?

MySQL:REGEXP 模式未按预期工作

oracle - 在数据泵导出期间排除特定表分区

oracle - rfc2047 电子邮件主题中的多个编码字

sql - 限制 LEFT JOIN

oracle - PL/SQL - 不更新更改的行

java.sql.SQLException:参数 IN 或 OUT 缺失,位于 l'index::3