IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

parcourir toutes les tables et supprimer par valeur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 12
    Par défaut parcourir toutes les tables et supprimer par valeur
    salut tout le monde,
    J'ai essayé de faire un script qui parcourt toutes les tables d'une BDD et les tables qu'elles contiennent.
    Les trois champ (clé1, clé2 et clé3) seront sélectionnées et supprimés toutes les lignes des tables qui ont comme valeurs de clé1 = A1, clé2 = A2, clé3 = A3
    et j'ai essayé comme script celui-la mais comme je suis debutant en sql je n'ai pas pu l'adapter a mon besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     begin
    for i in (select table_name, column_name from all_tab_columns where column_name like '%cle1%' and column_name like '%cle2%' and column_name like '%cle3%') loop
    execute immediate ' delete from' ||  i.table_name ||' WHERE cle1 = A1
            AND cle2 = A2
            AND cle3 = A3';
    end loop;
    commit;
    end;
    /

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    remplace :
    column_name LIKE '%cle1%'

    Par :
    column_name = 'cle1'

    pour les 3 clés déjà, parce que le nom de colonne doit exactement être cle1 ou alors remplacer cle1 par column_name dans le DELETE.

    Sinon, le script a l'air correct.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 12
    Par défaut
    tout d'abord merci pour la repense :
    quand je mets COLUMN_NAME = 'cle1' toute seul ca me renvoi touts les tables ainsi que les views avec un DBMS_OUTPUT.PUT_LINE(i.TABLE_NAME).

    Et si j'ajoute le AND COLUMN_NAME = 'cle2' oubien AND COLUMN_NAME = 'cle3'
    ca me renvoi aucun résultat, et même avec un DELETE la ou je selectione les tables juste avec COLUMN_NAME = 'cle1' j'ai un message d'erreur "table ou vue inexistante.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu as bien mis le texte à chercher en majuscule ?

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par tecsoul Voir le message
    tout d'abord merci pour la repense :
    quand je mets COLUMN_NAME = 'cle1' toute seul ca me renvoi touts les tables ainsi que les views avec un DBMS_OUTPUT.PUT_LINE(i.TABLE_NAME).

    Et si j'ajoute le AND COLUMN_NAME = 'cle2' oubien AND COLUMN_NAME = 'cle3'
    ca me renvoi aucun résultat, et même avec un DELETE la ou je selectione les tables juste avec COLUMN_NAME = 'cle1' j'ai un message d'erreur "table ou vue inexistante.
    Attention, Les noms de table, colonnes, etc.. sont en majuscule par défaut.
    Sinon, c'est bizarre ces conditions ! T'es sur du AND ?
    Parce que ça veut dire que le nom de la colonne contient cle1 cle2 et cle3 !

    Il faut les 3 colonnes, il me semble qu'un INTERSECT serait le mieux, ou un group by

    Exemple avec un INTERSECT qui te donne toutes les tables contenant les 3 colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT table_name
    FROM ALL_TAB_COLUMNS 
    WHERE column_name = 'CLE1'
    INTERSECT
    SELECT table_name
    FROM ALL_TAB_COLUMNS 
    WHERE column_name = 'CLE2'
    INTERSECT
    SELECT table_name
    FROM ALL_TAB_COLUMNS 
    WHERE column_name = 'CLE3'
    Exemple avec un group by (résultat identique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT table_name
    FROM ALL_TAB_COLUMNS 
    WHERE column_name = 'CLE1'
    OR column_name = 'CLE2'
    OR column_name = 'CLE3'
    GROUP BY table_name 
    HAVING COUNT(*) = 3
    A partir de là, tu fais ton execute immediate .. et .. Qu'est ce qu'on n'arrête pas de dire sur le forum ?
    Quand tu code un execute immediate : TOUJOURS faire un DBMS_OUTPUT de la commande qui va être exécutée, afin de valider les problèmes de quotes, d'espaces, etc...
    Voici le code (j'ai laissé volontairement l'erreur "table ou vue inexistante" pour que tu comprennes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    BEGIN
    FOR i IN (
          SELECT table_name
          FROM ALL_TAB_COLUMNS 
          WHERE column_name = 'CLE1'
          OR column_name = 'CLE2'
          OR column_name = 'CLE3'
          GROUP BY table_name 
          HAVING COUNT(*) = 3
                )
    LOOP      
        dbms_output.put_line(' delete from' ||  i.table_name ||' WHERE cle1 = A1 AND cle2 = A2 AND cle3 = A3');
        execute immediate ' delete from' ||  i.table_name ||' WHERE cle1 = A1 AND cle2 = A2 AND cle3 = A3';
        DBMS_OUTPUT.put_line( i.table_name ||' : '|| SQL%ROWCOUNT ||' lignes supprimées');
    END LOOP;
    COMMIT;
    END;

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 12
    Par défaut
    merci pour vos repenses :
    (j'ai mis tout en majuscule) et j'ai toujours l'erreur "table ou vue inexistante
    et le code que j'ai utilisé apres que votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    BEGIN
    FOR i IN (
          SELECT table_name
          FROM ALL_TAB_COLUMNS 
          WHERE column_name = 'CLE1'
          INTERSECT
          SELECT table_name
          FROM ALL_TAB_COLUMNS 
          WHERE column_name = 'CLE2'
          INTERSECT
          SELECT table_name
          FROM ALL_TAB_COLUMNS 
          WHERE column_name = 'CLE3'
                )
    LOOP      
        dbms_output.put_line(' delete from' ||  i.table_name ||' WHERE cle1 = A1 AND cle2 = A2 AND cle3 = A3');
        execute immediate ' delete from' ||  i.table_name ||' WHERE cle1 = A1 AND cle2 = A2 AND cle3 = A3';
        DBMS_OUTPUT.put_line( i.table_name ||' : '|| SQL%ROWCOUNT ||' lignes supprimées');
    END LOOP;
    COMMIT;
    END;
    malgré que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     dbms_output.put_line(' delete from' ||  i.table_name ||' WHERE cle1 = A1 AND cle2 = A2 AND cle3 = A3');
    affiche la bonne requête et quand j'exécute cette requete manuellement en sqlplus ca me donne des resultats c'est bizard non ???

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    ajouter le owner avant le nom de la table.

Discussions similaires

  1. Parcourir toutes les tables et champs pour modifier des champs precis
    Par Doncorleone8712 dans le forum VBA Access
    Réponses: 14
    Dernier message: 04/06/2012, 14h54
  2. Réponses: 1
    Dernier message: 07/05/2012, 11h03
  3. Réponses: 0
    Dernier message: 08/02/2011, 18h46
  4. Parcourir tout les Id qui commence par "dz_"
    Par FMaz dans le forum Général JavaScript
    Réponses: 28
    Dernier message: 24/03/2006, 21h46
  5. Supprimer TOUTES les tables d"une bd
    Par perlgirl dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/12/2004, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo