Как мне удалить данные из всех моих таблиц в ORACLE 10g - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть схема ORACLE, содержащая сотни таблиц. Я хотел бы удалить данные из всех таблиц (но не хочу удалять таблицы).

Есть ли простой способ сделать это или мне нужно написать сценарий SQL, который извлекает все имена таблиц и запускает команду TRUNCATE для каждого?

Я хотел бы удалить данные с помощью команд в сеансе SQL-Plus.

Ответы [ 5 ]

3 голосов
/ 17 февраля 2010

Если у вас есть ограничения ссылочной целостности (внешние ключи), усечение не будет работать; Вы не можете усечь родительскую таблицу, если существуют какие-либо дочерние таблицы, даже если дочерние таблицы пусты.

Следующий PL / SQL должен (он не тестировался, но в прошлом я выполнял похожий код) перебирать таблицы, отключать все внешние ключи, обрезать их, а затем снова включать все внешние ключи. Если таблица в другой схеме имеет ограничение RI для вашей таблицы, этот сценарий завершится ошибкой.

set serveroutput on size unlimited
declare
  l_sql       varchar2(2000);
  l_debug     number          := 1;  -- will output results if non-zero
                                     -- will execute sql if 0
  l_drop_user varchar2(30)    := ''  -- set the user whose tables you're dropping
begin
  for i in (select table_name, constraint_name from dba_constraints
             where owner = l_drop_user
               and constraint_type = 'R'
               and status = 'ENABLED')
  loop
    l_sql := 'alter table ' || l_drop_user || '.' || i.table_name || 
             ' disable constraint ' || i.constraint_name;
    if l_debug = 0 then
      execute immediate l_sql;
    else
      dbms_output.put_line(l_sql);
    end if;
  end loop;

  for i in (select table_name from dba_tables
             where owner = l_drop_user
            minus
            select view_name  from dba_views
             where owner = l_drop_user)
  loop
    l_sql := 'truncate table ' || l_drop_user || '.' || i.table_name ;
    if l_debug = 0 then
      execute immediate l_sql;
    else
      dbms_output.put_line(l_sql);
    end if;
  end loop;

  for i in (select table_name, constraint_name from dba_constraints
             where owner = l_drop_user
               and constraint_type = 'R'
               and status = 'DISABLED')
  loop
    l_sql := 'alter table ' || l_drop_user || '.' || i.table_name || 
             ' enable constraint ' || i.constraint_name;
    if l_debug = 0 then
      execute immediate l_sql;
    else
      dbms_output.put_line(l_sql);
    end if;
  end loop;
end;
/
2 голосов
/ 17 февраля 2010

Вероятно, самый простой способ - экспортировать схему без данных, а затем отбросить и повторно импортировать ее.

1 голос
/ 31 августа 2010

Мне пришлось сделать это недавно, и я написал хранимую процедуру, которую можно запустить с помощью: exec sp_truncate;. Большая часть кода основана на этом: ответ на отключение ограничений

    CREATE OR REPLACE PROCEDURE sp_truncate AS 
BEGIN
  -- Disable all constraints
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   ORDER BY c.constraint_type DESC)
  LOOP
    DBMS_UTILITY.EXEC_DDL_STATEMENT('ALTER TABLE ' || c.owner || '.' || c.table_name || ' disable constraint ' || c.constraint_name);
    DBMS_OUTPUT.PUT_LINE('Disabled constraints for table ' || c.table_name);
  END LOOP;

  -- Truncate data in all tables
   FOR i IN (SELECT table_name FROM user_tables)
   LOOP
      EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || i.table_name;
      DBMS_OUTPUT.PUT_LINE('Truncated table ' || i.table_name); 
   END LOOP;

   -- Enable all constraints
   FOR c IN
     (SELECT c.owner, c.table_name, c.constraint_name
      FROM user_constraints c, user_tables t
      WHERE c.table_name = t.table_name
      AND c.status = 'DISABLED'
      ORDER BY c.constraint_type)
     LOOP
       DBMS_UTILITY.EXEC_DDL_STATEMENT('ALTER TABLE ' || c.owner || '.' || c.table_name || ' enable constraint ' || c.constraint_name);
       DBMS_OUTPUT.PUT_LINE('Enabled constraints for table ' || c.table_name);
     END LOOP;

   COMMIT;
END sp_truncate;
/
1 голос
/ 17 февраля 2010

Я тоже смотрел на это.

Похоже, вам нужно просмотреть все имена таблиц.

Вы видели это ? Кажется, чтобы сделать трюк.

0 голосов
/ 17 февраля 2010

Размещение сведений с форумов OTN: усечение нескольких таблиц одним потоком в один сценарий SQL дает следующее, что можно запустить в сеансе SQL-Plus:

SET SERVEROUTPUT ON

BEGIN
    -- Disable constraints
    DBMS_OUTPUT.PUT_LINE ('Disabling constraints');
    FOR reg IN (SELECT uc.table_name, uc.constraint_name FROM user_constraints uc) LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || 'DISABLE' ||
            ' CONSTRAINT ' || reg.constraint_name || ' CASCADE';
    END LOOP;

    -- Truncate tables
    DBMS_OUTPUT.PUT_LINE ('Truncating tables');
    FOR reg IN (SELECT table_name FROM user_tables) LOOP
        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || reg.table_name;
    END LOOP;

    -- Enable constraints
    DBMS_OUTPUT.PUT_LINE ('Enabling constraints');
    FOR reg IN (SELECT uc.table_name, uc.constraint_name FROM user_constraints uc) LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || 'ENABLE' ||
            ' CONSTRAINT ' || reg.constraint_name;
    END LOOP;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...