代码之家  ›  专栏  ›  技术社区  ›  szaman

如何删除所有用户表?

  •  147
  • szaman  · 技术社区  · 15 年前

    如何删除Oracle中的所有用户表?

    我对约束有问题。当我禁用所有功能时,仍然是不可能的。

    8 回复  |  直到 6 年前
        1
  •  273
  •   関根康史 Henry Gao    7 年前
    BEGIN
       FOR cur_rec IN (SELECT object_name, object_type
                         FROM user_objects
                        WHERE object_type IN
                                 ('TABLE',
                                  'VIEW',
                                  'PACKAGE',
                                  'PROCEDURE',
                                  'FUNCTION',
                                  'SEQUENCE',
                                  'SYNONYM',
                                  '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;
    END;
    /
    
        2
  •  188
  •   khylo    9 年前

    如果你只想用一种非常简单的方法来做这件事……这是我过去用过的剧本

    select 'drop table '||table_name||' cascade constraints;' from user_tables;
    

    这将为模式中的所有表打印一系列DROP命令。假脱机处理此查询的结果并执行它。

    来源: https://forums.oracle.com/forums/thread.jspa?threadID=614090

    同样,如果要清除的表多于个,可以编辑以下内容以满足您的需要

    select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
    
        3
  •  43
  •   kazanaki    10 年前

    另一个对我有用的答案是 http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/ )

    BEGIN
    
    FOR c IN (SELECT table_name FROM user_tables) LOOP
    EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
    END LOOP;
    
    FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
    EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
    END LOOP;
    
    END;
    

    注意这是可行的 立即 在你运行它之后。它确实 不是 生成一个需要粘贴到某个地方的脚本(就像这里的其他答案)。它直接在数据库上运行。

        4
  •  21
  •   Stéphane Bruckert jungledev    11 年前
    begin
      for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
      loop
         execute immediate i.tbl;
      end loop;
    end;
    
        5
  •  10
  •   Brian    15 年前

    最简单的方法是使用cascade命令除去拥有对象的用户。

    DROP USER username CASCADE
    
        6
  •  6
  •   TJR    13 年前

    最简单的方法是删除表空间,然后重新构建表空间。但我不想那样做。这类似于亨利的,只是我只是在图形用户界面的结果集上进行复制/粘贴。

    SELECT
      'DROP'
      ,object_type
      ,object_name
      ,CASE(object_type)
         WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
         ELSE ';'
       END
     FROM user_objects
     WHERE
       object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')
    
        7
  •  1
  •   wibeasley    6 年前
    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
    FROM user_tables;
    

    user_tables 是包含用户所有表的系统表 select子句将为每个表生成一条drop语句 你可以运行脚本

        8
  •  1
  •   Goyal Vicky    6 年前

    要删除Oracle中的所有对象:

    1)动态

    DECLARE
    CURSOR IX IS
    SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
    AND OWNER='SCHEMA_NAME';
     CURSOR IY IS
     SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
    IN ('SEQUENCE',
    'PROCEDURE',
    'PACKAGE',
    'FUNCTION',
    'VIEW') AND  OWNER='SCHEMA_NAME';
     CURSOR IZ IS
     SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
    BEGIN
     FOR X IN IX LOOP
       EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' '||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
     END LOOP;
     FOR Y IN IY LOOP
       EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' '||Y.OBJECT_NAME);
     END LOOP;
     FOR Z IN IZ LOOP
       EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' '||Z.OBJECT_NAME||' FORCE ');
     END LOOP;
    END;
    /
    

    2)静态

        SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
            union ALL
            select 'drop '||object_type||' '|| object_name || ';' from user_objects 
            where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
            union ALL
            SELECT 'drop '
            ||object_type
            ||' '
            || object_name
            || ' force;'
            FROM user_objects
            WHERE object_type IN ('TYPE');