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

SQL Oracle Discussion :

Oralce 10g - Table temporaire


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  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 : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pourquoi tu passes par une table temporaire ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    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 ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 50
    Points : 65
    Points
    65
    Par défaut Syntaxe particulière d'UPDATE
    Essayez peut-être la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    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"

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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 ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    désolé pour l'interpretation erroné

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    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.

  10. #10
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    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.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Ca marche bien joué !!

    J'avais un doute sur la jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Tout ça pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    ...
    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!

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/09/2010, 11h58
  2. [10g] Suppression d'une table temporaire
    Par apersonnat dans le forum Administration
    Réponses: 6
    Dernier message: 18/11/2008, 15h38
  3. Suppression table temporaire...
    Par Royd938 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2004, 12h00
  4. [procédure stockée] table temporaire commençant par #???
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/04/2004, 12h23
  5. Nettoyage de table temporaire
    Par Alain Dionne dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/02/2004, 20h44

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