【问题标题】:How to delete all data in Oracle Database with SQL?如何使用 SQL 删除 Oracle 数据库中的所有数据?
【发布时间】:2015-10-31 14:59:31
【问题描述】:

我在测试一些 SQL 命令时创建了很多表和用户,现在我不记得所有的表和用户名了。

但现在我想为我的大项目删除所有这些。那么可以在 SQL 命令行中删除它吗?

【问题讨论】:

  • stackoverflow.com/questions/4393/… 只需将 'drop' 更改为 'truncate'。
  • 这个问题是针对 SQL server 的,表的详细信息存储在 All_tables/USER_TABLES/dba_TABLESsee here 而不是信息架构中。
  • 如果您的问题是要找到一个解决方案,该解决方案只选择您创建的表并且具有相同的登录用户和相同的架构,我认为没有解决方案! ;)。

标签: sql database oracle


【解决方案1】:

此 PL/SQL 块将有助于删除 oracle 数据库中的所有数据

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】:

    你有两种方法:

    1. 你可以使用函数delete 代替truncate 这个函数你不应该禁用约束,但是它工作得更慢,因为如果你这样做的话你可以回滚这个操作:

      BEGIN
      
        FOR table_ IN (SELECT * FROM dba_tables where owner like 'YOUR_SCHEMA') LOOP
         execute immediate 'delete from table ' || table_.owner || '.' || table_.table_name;
        END LOOP;
      END;
      
    2. 使用truncate会更快,但你必须禁用表格约束:

      begin
      
        for disable_constraint_ in
          (select * from dba_constraints where owner= 'YOUR_SCHEMA'
        )
        loop
        execute immediate 'alter table ' || disable_constraint_.owner || '.' || disable_constraint_.table_name ||' disable constraint '|| disable_constraint_.constraint_name;
        end loop;
        for table_ in (select * from dba_tables where owner = 'YOUR_SCHEMA')
        loop
          execute immediate 'truncate table ' || table_.owner || '.' ||table_.table_name ||' cascade';
        end loop;
        for enable_constaint_ in (select * from dba_constraints where owner= 'YOUR_SCHEMA')
        loop
        execute immediate 'alter table ' || enable_constaint_.owner || '.' || enable_constaint_.table_name ||' enable constraint '|| enable_constaint_.constraint_name;
       end loop;
      end;
      

    【讨论】:

      【解决方案3】:
         BEGIN
      
              FOR T in (SELECT table_name FROM user_tables) LOOP
                EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS';
                --This will disable all the constraint  
              END LOOP;
      
      
              FOR T in (SELECT table_name FROM user_tables) LOOP
                EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
              END LOOP;
      
              FOR T in (SELECT table_name FROM user_tables) LOOP
                EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS';
              END LOOP;
          END;
      

      Alter table ...禁用所有约束会抛出 ORA-01735: invalid ALTER TABLE option if there is not defined for the table,这将导致脚本无法截断每个表,如果至少有一个表没有约束。您可能希望将执行立即放在 begin -exception 块中

      【讨论】:

        【解决方案4】:

        执行这个命令:

        BEGIN
           FOR table_ IN (SELECT * FROM dba_tables where owner like 'YOUR_SCHEMA') LOOP
               execute immediate 'truncate table ' || table_.owner || '.' || table_.table_name ||' cascade';
           END LOOP;
        END;
        /
        

        【讨论】:

          猜你喜欢
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-15
          • 2017-06-30
          • 2020-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多