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

Oracle Discussion :

Delete avec requête imbriquée et clé primaire


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut Delete avec requête imbriquée et clé primaire
    Bonjour,

    Je vais essayer de vous énoncer mon problème le plus explicitement possible.

    J'ai des requêtes de suppression écrites dynamiquement en java.
    J'ai une table temporaire qui stocke les ID et les tables impactées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE GLOBAL TEMPORARY TABLE TMP_BATCH_EXTRACTION
    (
      ID      VARCHAR2(25 BYTE),
      TABLES  VARCHAR2(80 BYTE)
    )
    ON COMMIT PRESERVE ROWS
    NOCACHE;
    J'effectue une suppression via une requête imbriquée pour faire la relation de la table impactée avec la table temporaire contenant les ID à supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from (select A.* from TSERVICE A, TMP_BATCH_EXTRACTION B 
    where A.ID=B.ID and B.TABLES like '%@TSERVICE@%'
    Fonctionne car TSERVICE ne contient qu'une clé primaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from (select A.* FROM SERVICE_CONFIGMATERIELLES A, TMP_BATCH_EXTRACTION B 
    WHERE A.SOURCE=B.ID AND TABLES LIKE '%@TSERVICE@%')
    Ne fonctionne pas car SERVICE_CONFIGMATERIELLES contient une clé primaire définie sur 2 colonnes

    Le problème survient quand la table impactée n'a pas de clé primaire ou sur plusieurs colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java.sql.SQLException: ORA-01752: Impossible de supprimer de la vue
     sans exactement une table protégée par clé
    Il faut savoir que la vue est le résultat de la requête imbriquée.

    Si j'ajoute une clé primaire [ID] sur ma table temporaire, qui sert de liaison, tout fonctionne que la table impactée aie ou non des clés primaires, mais le problème c'est qu'un ID peut être indentique sur plusieurs tables, donc j'ai besoin de faire une clé primaire sur les 2 colonnes [ID, TABLES] et quand je suis sur 2 clés primaires, il me retourne la même erreur.

    Comment résoudre mon problème épineux ?

    En vous remerciant d'avance.
    Boutss

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    un DELETE d'une table temporaire c'est un non sens. Soit tu ne l'utilises pas à bon escient soit tu n'as pas compris le but de celle-ci

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Oui on est bien d'accord !!
    Ce n'est pas sur la table temporaire que je veux faire le delete mais sur l'autre table (Ex : TSERVICE). La table temporaire ne sert juste qu'à faire la liaison sur des ID stockés.
    C'est d'ailleurs pour cela que je fais une requête imbriquée, sinon je ferais directement une liaison avec la clause du "delete".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from (select A.* from TSERVICE A, TMP_BATCH_EXTRACTION B 
    where A.ID=B.ID)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Et pourquoi compliquer la vie du moteur ?

    C'est beaucoup plus lisible de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM SERVICE_CONFIGMATERIELLES  
    WHERE SOURCE IN (SELECT ID FROM TMP_BATCH_EXTRACTION TABLES LIKE '%@TSERVICE@%')

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    En voilà une bonne idée...

    J'ai tellement la tête dedans que je n'arrive pas à voir l'évidence.

    Mon 1er test a fonctionné, je mets en place et mets résolu ce post.

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête DELETE avec un select imbriqué
    Par unix27 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 01/11/2012, 11h22
  2. Requête Update avec requête imbriquée
    Par sybaris dans le forum Développement
    Réponses: 2
    Dernier message: 05/07/2008, 12h51
  3. Insert avec requête imbriquée
    Par kyra78 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/03/2008, 16h21
  4. insertion avec requête imbriquées
    Par Manfried dans le forum Requêtes
    Réponses: 7
    Dernier message: 19/11/2005, 09h51
  5. Réponses: 4
    Dernier message: 04/08/2005, 08h23

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