Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 08/02/2008, 20h30   #1
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
Par défaut Oralce 10g - Table temporaire

Bonjour,

J'ai la problématique suivante sous Oracle :

J'ai une table T1(ID,CODE) qui ne contient pas le bon CODE.

Je veux donc mettre à jour ce code sachant que T1 n'est reliée à aucune autre table. Seule solution pour moi : créer une table temporaire.

TEMP(ID,CODE,NOUVEAU_CODE).

Ce que j'ai fait par la syntaxe suivante, mais mon problème c'est que ma table est vide bien que mon client TOAD me dise que les lignes sont bien insérées dans ma table temporaire :

Code :
1
2
3
 
CREATE GLOBAL TEMPORARY TABLE TEMP_AGR AS 
SELECT A.C_ID_AGREGATION AS ID, A.C_CLIENT AS ID_CLIENT, C.C_CLIENT AS C_CLIENT FROM AGREGATION_PNB A INNER JOIN CLIENT C ON C.C_ID_CLIENT = A.C_CLIENT
Puis l'insert :

Code :
1
2
3
4
 
INSERT INTO TEMP_AGR(ID, ID_CLIENT, C_CLIENT)
SELECT A.C_ID_AGREGATION, A.C_CLIENT, 
C.C_CLIENT FROM AGREGATION_PNB A INNER JOIN CLIENT C ON C.C_ID_CLIENT = A.C_CLIENT
Par contre comment je fais pour l'update ?

Ce que je veux c'est faire un update en masse et la requête suivante ne donne rien :
Code :
UPDATE AGREGATION_PNB SET C_CLIENT = (SELECT TEMP_AGR.C_CLIENT FROM TEMP_AGR, AGREGATION_PNB A WHERE TEMP_AGR.ID = A.C_ID_AGREGATION)
Merci pour toute info.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 20h49   #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
pourquoi tu passes par une table temporaire ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 21h02   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 975
Points : 3 975
Citation:
Envoyé par david71 Voir le message
Je veux donc mettre à jour ce code sachant que T1 n'est reliée à aucune autre table. Seule solution pour moi : créer une table temporaire.
Pourquoi tu ne rajoutes pas une autre colonne TEMP où tu pourrais faire une copie des données d'origine de CODE puis faire des mises à jour sur CODE puis suppression de TEMP ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 15h59   #4
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
Jerome,

Merci pour ta réponse mais ça voudrait dire que je dois modifier la structure de ma table T1 ? Ce qui n'est pas l'idéal...

Pour récapituler T1=AGREGATION_PNB
AGREGATION_PNB est remplie automatiquement par une requête mais le problème c'est que la requête ne me donne pas ce que je veux donc je dois faire cette mise à jour moi-même.

Si évidemment je peux me passer de la table temporaire je veux bien mais comment ?

Bon, reprenons voilà la table AGREGATION_PNB(C_ID_AGREGATION,C_CLIENT) dont je ne donne pas toutes les colonnes car pas utile.
Cette table a une clé primaire C_ID_AGREGATION mais c'est tout. Lorsque cette table est remplie, j'ai par exemple :
Code :
1
2
3
4
5
6
 
C_ID_AGREGATION  C_CLIENT
1                          70
2                          70
3                          15
4                          25

C_CLIENT ne contient pas les bonnes données.
Dans mon MCD, il existe une table client CLIENT(C_ID_CLIENT, C_CLIENT) et en fait C_CLIENT(AGREGATION_PNB) = C_ID_CLIENT(CLIENT) ce qui est faux.
On devrait avoir C_CLIENT(AGREGATION_PNB) = C_CLIENT(CLIENT) !

Voilà ma table CLIENT par exemple :
Code :
1
2
3
4
5
 
C_ID_CLIENT   C_CLIENT
70                 1234
15                 0025
25                 0030
Ce que je cherche à faire au final c'est avoir ma table AGREGATION_PNB avec :
Code :
1
2
3
4
5
6
 
C_ID_AGREGATION  C_CLIENT
1                          1234
2                          1234
3                          0025
4                          0030
Voilà j'espère avoir été un peu plus clair .
Merci pour vos suggestions.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 22h13   #5
Membre du Club
 
Inscription : janvier 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 50
Points : 47
Points : 47
Par défaut Syntaxe particulière d'UPDATE

Essayez peut-être la syntaxe suivante :

Code :
1
2
3
4
5
6
UPDATE
    (SELECT a.col AS old_value, 
            b.col AS new_value 
     FROM a, b 
     WHERE a.cle = b.cle)
SET old_value = new_value;
wondersonic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2008, 09h07   #6
Membre éclairé
 
Inscription : août 2005
Messages : 316
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2005
Messages : 316
Points : 342
Points : 342
Citation:
pourquoi tu passes par une table temporaire ?
Ce que veut dire orafrance je pense ,
c'est pourquoi utiliser une table temporaire et non une table classique
en sachant que les données de la table temporaire ne sont visible que
depuis la session qui les crées et sont supprimer a la fin de la session
ou sur le commit si pas créer avec "on commit preserve rows"
c.langlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2008, 09h27   #7
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
non, ce que je voulais dire c'est pourquoi ne pas ajouter la colonne dans la table d'origine, mettre à jour cette colonne et supprimer l'ancienne ?

elle est sensée être rempli comment cette table temporaire ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2008, 11h08   #8
Membre éclairé
 
Inscription : août 2005
Messages : 316
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2005
Messages : 316
Points : 342
Points : 342
désolé pour l'interpretation erroné
c.langlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 23h37   #9
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
Je vous tiens au courant, merci. Je regarde si la syntaxe de wondersonic marche ce qui m'éviterait d'utiliser en effet une table temporaire.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 09h58   #10
Membre confirmé
 
Avatar de LBO72
 
Inscription : mai 2007
Messages : 385
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France

Informations forums :
Inscription : mai 2007
Messages : 385
Points : 282
Points : 282
Citation:
David71
Je vous tiens au courant, merci. Je regarde si la syntaxe de wondersonic marche ce qui m'éviterait d'utiliser en effet une table temporaire
Je serais curieux de savoir si la solution de wondersonic marche

Merci de nous tenir au courant.
LBO72.
LBO72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 12h24   #11
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
Ca marche bien joué !!

J'avais un doute sur la jointure :

Code :
1
2
3
4
5
6
7
 
UPDATE
    (SELECT A.C_CLIENT AS old_value, 
            C.C_CLIENT AS new_value 
     FROM CLIENT C, AGREGATION_PNB A
     WHERE C.C_ID_CLIENT = A.C_CLIENT)
SET old_value = new_value;
En effet, la colonne C_ID_CLIENT est un type NUMBER et C_CLIENT est un type VARCHAR2, mais ça passe quand même en tout cas exécuté via un analyseur de requêtes.

Merci beaucoup.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 10h36   #12
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par david71 Voir le message
Ca marche bien joué !!

En effet, la colonne C_ID_CLIENT est un type NUMBER et C_CLIENT est un type VARCHAR2, mais ça passe quand même en tout cas exécuté via un analyseur de requêtes.

Merci beaucoup.
Alors il faut utiliser la conversion implicite dans le sens qui vous intéresse. Il ne faut pas laisser de conversion implicite dans le code ...
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 14h36   #13
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

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

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Tout ça pour
Code :
1
2
3
4
5
 
UPDATE AGREGATION_PNB a
  SET c_client = (SELECT b.c_client
                    FROM t_client b
                   WHERE b.c_id_client = a.c_client)
Citation:
...
En effet, la colonne C_ID_CLIENT est un type NUMBER et C_CLIENT est un type VARCHAR2, mais ça passe quand même en tout cas exécuté via un analyseur de requêtes.
...
Peut être que ça passe mais les résultat sont très probablement incorrectes vue que '0025' n'est pas 25!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h41.


 
 
 
 
Partenaires

Hébergement Web