2010-02-17 6 views
0

J'ai un schéma ORACLE contenant des centaines de tables. Je voudrais supprimer les données de toutes les tables (mais je ne veux pas faire tomber les tables).Comment supprimer les données de toutes mes tables dans ORACLE 10g

Y at-il un moyen facile de faire cela ou dois-je écrire un script SQL qui récupère tous les noms de table et exécute la commande TRUNCATE sur chacun?

Je voudrais supprimer les données en utilisant des commandes dans une session SQL-Plus.

Répondre

1

Je regardais cela aussi.

On dirait que vous devez parcourir tous les noms de tables. Avez-vous vu this? Semble faire l'affaire.

2

Probablement le moyen le plus simple est d'exporter le schéma sans données, puis de le supprimer et de le réimporter.

+0

Non seulement le plus facile, mais s'il y a une quantité de données dans ces tableaux, alors ce serait la méthode la plus rapide aussi. – NotMe

3

Si vous avez des contraintes d'intégrité référentielle (clés étrangères), alors tronquer ne fonctionnera pas; vous ne pouvez pas tronquer la table parent si des tables enfants existent, même si les enfants sont vides. Le PL/SQL suivant (il n'est pas testé, mais j'ai déjà exécuté un code similaire) itère sur les tables, en désactivant toutes les clés étrangères, en les tronquant, puis en réactivant toutes les clés étrangères. Si une table dans un autre schéma a une contrainte RI sur votre table, ce script échouera.

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; 
/
+0

il est exécuté correctement mais cela ne fonctionne pas! les données sont toujours dans tous les tableaux. – Walllzzz

+0

Pouvez-vous montrer l'avant et l'après de cela? Parce que c'est du code que j'utilise sur une base semi-régulière. –

0

Mettre les détails du fil OTN Discussion Forums: truncating multiple tables with single query dans un script SQL donne la suite qui peut être exécuté dans une session 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; 
/
1

je devais le faire récemment et écrit une procédure stockée que vous pouvez exécuter via: exec sp_truncate;. La plupart du code est basé sur ceci: answer sur la désactivation des contraintes

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; 
/
Questions connexes