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 :

PL/SQL et mise à jour d'une table


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 54
    Points : 56
    Points
    56
    Par défaut PL/SQL et mise à jour d'une table
    Bonjour à tous,

    Je suis actuellement en train de travailler sur une requête SQL qui me permettrait de mettre à jour le champ d’une table en fonction du contenu de deux autres tables. Mais je galère un peu, je me permets donc de demander votre aide .
    Je m’explique:
    J’ai trois tables : Ville, Entrepot1 et Entrepot2.
    La table Ville contient une clé primaire qui est Name. De même pour les tables Entrepot1 et Entrepot2.
    Le champ CityName est une clé étrangère dans Entrepot1 et Entrepot2 du champ Name de la table Ville.
    Ci-dessous un exemple du contenu de ces tables.

    Ville
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Name          Month        MaxRef
    Paris         January       0  
    Marseille     February      0

    Entrepot1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Name          CityName  Reference
    Paris_1       Paris       1
    Paris_2       Paris       0
    Marseille_1   Marseille   10
    Marseille_2   Marseille   0
    Entrepot2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Name          CityName  Reference
    Paris_3       Paris       0
    Paris_4       Paris       1
    Paris_5       Paris       50
    Marseille_3   Marseille   200
    Je cherche, pour chaque ville de la table Ville (donc chaque ligne), à récupérer le maximum du champ Reference des tables Entrepot1 et Entrepot2 pour le CityName correspondant.
    Dans mon exemple ci-dessus, pour la ville Paris, dans la table Entrepot1, il y a deux valeurs possibles pour Reference pour Paris: 1 et 0. Dans la table Entrepot2, il y a trois valeurs possibles pour Reference pour Paris: 0, 1 et 50.
    Je recherche donc le maximum des deux tables Entrepot1 et Entrepot2, cad : max(1, 0, 0, 1, 50)=50. Cette valeur 50 doit alors être mise dans la table Ville pour le champ Paris.

    J’ai commencé à écrire un script PL/SQL, mais j’obtiens l’erreur ORA—00904 (Identificateur non valide), portant a priori sur l'egalité var1.name = var2.name.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BEGIN
      FOR var1 IN (select v.name as name, max(e.Reference) as eRef from Entrepot1 e, Ville v where e.CityName = v.name group by v.name) LOOP
        BEGIN
          FOR var2 IN (SELECT name, MAXREF FROM Ville) LOOP
            IF (UPPER(var1.name) <> UPPER(var2.name)) THEN
              IF (var1.eRef > var2.MAXREF) THEN
                EXECUTE IMMEDIATE 'update Ville set MAXREF = ' || var1.eRef || ' where name = ' || var1.name;
              END IF;
            END IF;
          END LOOP;
        END;
      END LOOP;
    END;
    /
    J'ai pensé au PL/SQL pour cette manipulation, mais je reste persuadé qu'une simple requête SQL fasse l'affaire.
    Si quelqu'un comprend ce que j'ai raconté ici et peut m'aider, je suis preneur .
    Merci d'avance pour votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Bonjour,

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    WITH Ville AS
    (
    SELECT 'Paris' 	   AS Name, 'January'  AS Month, 0  AS MaxRef 	FROM DUAL UNION ALL
    SELECT 'Marseille' 	  , 'February' 	       , 0  		FROM DUAL
    ), 
    Entrepot1 AS
    (
    SELECT 'Paris_1' 	AS Name , 'Paris' 	AS CityName, 1 	AS Reference 	FROM DUAL UNION ALL
    SELECT 'Paris_2' 		, 'Paris' 		   , 0 	 		FROM DUAL UNION ALL
    SELECT 'Marseille_1' 		, 'Marseille' 		   , 10  		FROM DUAL UNION ALL
    SELECT 'Marseille_2' 		, 'Marseille' 		   , 0 	 		FROM DUAL 
    ), 
    Entrepot2 AS
    (
    SELECT 'Paris_3' 	AS Name , 'Paris' 	AS CityName, 0 	AS Reference 	FROM DUAL UNION ALL
    SELECT 'Paris_4' 		, 'Paris' 		   , 1 	 		FROM DUAL UNION ALL
    SELECT 'Paris_5' 		, 'Paris' 		   , 50  		FROM DUAL UNION ALL
    SELECT 'Marseille_3' 		, 'Marseille' 		   , 200 	 	FROM DUAL 
    ), 
    entrepot12 AS
    ( 
     SELECT * 
     FROM Entrepot1 
     UNION ALL
     SELECT * 
     FROM Entrepot2 
    )
    SELECT V.name,v.month,e.reference as MaxRef
    FROM VILLE v 
         INNER JOIN entrepot12 e ON v.Name = e.CityName
    WHERE e.reference = (SELECT MAX(tt.reference)
                         FROM entrepot12 tt
                         WHERE tt.CityName = e.CityName                     
                         )     
    /
     
    NAME      MONTH        MAXREF
    --------- -------- ----------
    Paris     January          50
    Marseille February        200
    Cordialement.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 54
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup ORA-007 pour cette réponse ultra-rapide.
    Par contre, la question peut paraître bête, mais comment mettre à jour (via une requête Update) à la volée la table Ville avec le résultat de la requête que tu as fournie?

    Merci encore .

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Finger in the nose

    Utilise un MERGE .

    http://oracle.developpez.com/faq/?page=3-1#merge
    Cordialement.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 58
    Points : 86
    Points
    86
    Par défaut
    Bonsoir,

    Je pense que cette discussion dans le forum SQL pourrait t'aider:

    http://www.developpez.net/forums/d11...re-evolutions/


    EDIT: Mince me suis fait griller Le lien ci-dessous montre d'autres syntaxes que le MERGE, c'est toujours intéressant de savoir que cela existe
    Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 54
    Points : 56
    Points
    56
    Par défaut
    Génial, ça marche ! J'ai utilisé un MERGE pour arriver à mes fins.
    Merci beaucoup pour votre aide, c'était super utile !

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

Discussions similaires

  1. [AC-2003] SQL : Mise à jour d'une table à partir d'une autre
    Par denisw95 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/11/2009, 13h52
  2. Réponses: 1
    Dernier message: 23/11/2009, 09h47
  3. Réponses: 4
    Dernier message: 16/09/2009, 15h21
  4. [SQL] Ajout de données et Mise à jour d'une table
    Par wonga dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 31/07/2007, 16h01
  5. Réponses: 1
    Dernier message: 27/03/2007, 10h23

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