Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/03/2007, 13h37   #1
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
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 : 151
Points : 151
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 :
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 :
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 :
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 :
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
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 14h45   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h17   #3
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
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 : 151
Points : 151
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 :
1
2
DELETE FROM (SELECT A.* FROM TSERVICE A, TMP_BATCH_EXTRACTION B 
WHERE A.ID=B.ID)
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h24   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Et pourquoi compliquer la vie du moteur ?

C'est beaucoup plus lisible de faire ceci :

Code :
1
2
DELETE FROM SERVICE_CONFIGMATERIELLES  
WHERE SOURCE IN (SELECT ID FROM TMP_BATCH_EXTRACTION TABLES LIKE '%@TSERVICE@%')
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h32   #5
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
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 : 151
Points : 151
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.
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h02.


 
 
 
 
Partenaires

Hébergement Web