作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。
我的脚本创建了一个过程来删除表/序列,执行该过程,然后删除该过程。我正在从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/