2015-12-02 42 views
0

我在下面选择查询,它将生成删除语句以删除模式中的所有对象。使用Oracle中的批处理文件删除模式中的所有对象

select 'DROP '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME 
     || case when OBJECT_TYPE = 'TABLE' 
       then ' CASCADE CONSTRAINTS PURGE' else '' end 
     ||';' 
    from all_objects 
where OWNER = 'RATOR_MONITORING'; 

我想创建批处理文件和假设,而不是生成delete语句separetly我可以创建可光标或东西,并将其保存在批处理文件并运行该批处理文件删除模式中的所有内容。怎么做?

回答

1

您可以在网上找到许多脚本。他们都没有100%的工作。我们可以有各种各样的陷阱。像调度程序链或物化视图组一样。

这是我使用的一个(它也是由一个激励我在网上查到)

set serveroutput on size unlimited 
declare 
    v_ItemCount integer; 
begin 
    SELECT count(*) 
    INTO v_ItemCount 
    FROM ALL_OBJECTS AO 
    WHERE AO.OWNER = '&USER' 
    AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
    AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    while (v_ItemCount > 0) loop 
    for v_Cmd in (SELECT 'drop ' || AO.OBJECT_TYPE || ' ' || '"'||AO.OWNER||'"'|| '.' || '"'||AO.OBJECT_NAME||'"' || 
         DECODE(AO.OBJECT_TYPE, 
           'TABLE', 
           ' CASCADE CONSTRAINTS', 
           '') as DROPCMD, 
           AO.OWNER, 
           AO.OBJECT_TYPE, 
           AO.OBJECT_NAME 
        FROM ALL_OBJECTS AO 
        WHERE AO.OWNER = '&USER' 
        AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
        AND AO.OBJECT_NAME NOT LIKE 'BIN$%') 
    loop 
     begin 
     if v_Cmd.OBJECT_TYPE = 'SCHEDULE' then 
      DBMS_SCHEDULER.DROP_SCHEDULE(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'JOB' then 
      DBMS_SCHEDULER.DROP_JOB(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'PROGRAM' then 
      DBMS_SCHEDULER.DROP_PROGRAM(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true);        
     else 
      execute immediate v_Cmd.dropcmd; 
     end if; 
     dbms_output.put_line(v_Cmd.dropcmd);   
     exception 
     when others then 
      null; -- ignore errors 
     end; 
    end loop; 
    SELECT count(*) 
     INTO v_ItemCount 
     FROM ALL_OBJECTS AO 
    WHERE AO.OWNER = '&USER'  
     AND AO.OBJECT_TYPE NOT IN ('INDEX','LOB') 
     AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    end loop; 
    execute immediate 'purge dba_recyclebin'; 
end; 
+0

它工作的执行对我来说,但如果不想删除调度程序作业,然后如何更改代码呢? – Andrew

+0

我不想提供输入值。它应该直接运行 – Andrew

+1

我通常以sys(sysdba user)的身份连接到数据库,并且我不想删除任何内部数据库对象。如果要在用'USER_'替换每个出现的'ALL_'时清除自己的模式。然后从所有where子句移除'..OWNER ='&USER''。 – ibre5041

1

这里是脚本

begin 
    for i in (select * from dba_objects where owner = 'SO' and object_type <> 'TABLE') 
    loop 
    execute immediate 'drop ' || i.object_type || ' ' || i.object_name; 
    end loop; 
    for j in (select * from dba_objects where owner = 'SO' and object_type = 'TABLE') 
    loop 
    execute immediate 'drop ' || j.object_type || ' ' || j.object_name || ' cascade constraints'; 
    end loop; 
end; 
/

此链接提供了有关如何创建shell脚本或批处理脚本来运行SQL脚本的详细信息。

https://oracle-base.com/articles/misc/oracle-shell-scripting

+0

这个剧本给我,不能删除索引错误用于键 – Andrew

1
Here we go i have compiled a shell to perform the Purge Schema. Let me know if this helps. 

#weekly report 
#!/bin/ksh 
export ORACLE_HOME=/opt/oracle/product/1020 
export PATH=$ORACLE_HOME/bin:$PATH:. 
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 

ABC=`sqlplus -s <username>/<password>@<sid> <<+ 
set sqlbl on; 
set serveroutput on; 
DECLARE 
    v_ItemCount INTEGER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_ItemCount 
    FROM ALL_OBJECTS AO 
    WHERE AO.OWNER   = '&USER' 
    AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
    AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    WHILE (v_ItemCount > 0) 
    LOOP 
    FOR v_Cmd IN 
    (SELECT 'drop ' 
     || AO.OBJECT_TYPE 
     || ' ' 
     || '"' 
     ||AO.OWNER 
     ||'"' 
     || '.' 
     || '"' 
     ||AO.OBJECT_NAME 
     ||'"' 
     || DECODE(AO.OBJECT_TYPE, 'TABLE', ' CASCADE CONSTRAINTS', '') AS DROPCMD, 
     AO.OWNER, 
     AO.OBJECT_TYPE, 
     AO.OBJECT_NAME 
    FROM ALL_OBJECTS AO 
    WHERE AO.OWNER   = '&USER' 
    AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
    AND AO.OBJECT_NAME NOT LIKE 'BIN$%' 
    ) 
    LOOP 
     BEGIN 
     IF v_Cmd.OBJECT_TYPE = 'SCHEDULE' THEN 
      DBMS_SCHEDULER.DROP_SCHEDULE(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'JOB' THEN 
      DBMS_SCHEDULER.DROP_JOB(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'PROGRAM' THEN 
      DBMS_SCHEDULER.DROP_PROGRAM(v_Cmd.OWNER||'.'||v_Cmd.OBJECT_NAME, true); 
     ELSE 
      EXECUTE immediate v_Cmd.dropcmd; 
     END IF; 
     dbms_output.put_line(v_Cmd.dropcmd); 
     EXCEPTION 
     WHEN OTHERS THEN 
     NULL; -- ignore errors 
     END; 
    END LOOP; 
    SELECT COUNT(*) 
    INTO v_ItemCount 
    FROM ALL_OBJECTS AO 
    WHERE AO.OWNER   = '&USER' 
    AND AO.OBJECT_TYPE NOT IN ('INDEX','LOB') 
    AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    END LOOP; 
    EXECUTE immediate 'purge dba_recyclebin'; 
END; 
/
exit 
+` 
+0

这个脚本正在绞死,它也非常复杂。我们有其他更简单的脚本来删除所有对象吗? – Andrew

+0

是的,我们有..让我为你准备一个更简单的方法:)。我基本上复制了下面的答案中提到的为你工作的脚本。我只是折射它在一个壳内,并尝试在我的工作区,它工作正常 –

相关问题