我将准备一个自动化的 Oracle 脚本,用于在数据泵过程中通过 Bambo 清理数据库。
到目前为止,我在 sql Developer 中手动执行这些查询,以便在导入数据泵文件之前清理数据库。
select 'drop TABLE ' || object_name || ';' from user_objects where object_type = 'TABLE';
select 'drop view ' || object_name || ';' from user_objects where object_type = 'VIEW';
select 'drop INDEX ' || object_name || ';' from user_objects where object_type = 'INDEX';
select 'drop PACKAGE ' || object_name || ';' from user_objects where object_type = 'PACKAGE';
select 'drop TYPE ' || object_name || ';' from user_objects where object_type = 'TYPE';
select 'drop sequence ' || object_name || ';' from user_objects where object_type = 'SEQUENCE';
select 'drop synonym ' || object_name || ';' from user_objects where object_type = 'SYNONYM';
select 'drop PROCEDURE ' || object_name || ';' from user_objects where object_type = 'PROCEDURE';
select 'drop FUNCTION ' || object_name || ';' from user_objects where object_type = 'FUNCTION';
select 'drop DATABASE LINK ' || object_name || ';' from user_objects where object_type = 'DATABASE LINK';
select 'drop JOB ' || object_name || ';' from user_objects where object_type = 'JOB';
select 'drop MATERIALIZED VIEW ' || object_name || ';' from user_objects where object_type = 'MATERIALIZED VIEW';
我现在需要自动执行这些下降,无需任何手动操作。因此,我需要创建 sql 脚本来删除这些对象:TABLE、VIEW、MATERIALIZED VIEW、INDEX、PACKAGE、TYPE、SEQUENCE、SYNONYM、PROCEDURE、FUNCTION、DATABASE LINK 和 JOB
我完成了这个脚本:
BEGIN
FOR cur_rec IN (SELECT object_name, object_type
FROM user_objects
WHERE object_type IN
('TABLE',
'VIEW',
'MATERIALIZED VIEW',
'PACKAGE',
'TYPE',
'PROCEDURE',
'FUNCTION',
'SEQUENCE',
'SYNONYM',
'INDEX',
'DATABASE LINK',
'JOB',
'PACKAGE BODY'
))
LOOP
BEGIN
IF cur_rec.object_type = 'TABLE'
THEN
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '" CASCADE CONSTRAINTS';
ELSE
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"';
END IF;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('FAILED: DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"'
);
END;
END LOOP;
FOR cur_rec IN (SELECT *
FROM all_synonyms
WHERE table_owner IN (SELECT USER FROM dual))
LOOP
BEGIN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
END;
END LOOP;
END;
我不确定它是否完全符合我的需求以及是否会进行优化(没有任何可能的问题)。
你能帮我吗?
提前感谢您的帮助
我建议
DROP SCHEMA schema_name CASCADE
担任 DBA。
然后使用
CREATE USER...
重新创建用户 完全干净且更易于管理,因为您不必担心尚未编码的对象类型。