Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 28/09/2011, 15h35   #1
Futur Membre du Club
 
M H
Inscription : octobre 2010
Messages : 45
Détails du profil
Informations personnelles :
Nom : M H

Informations forums :
Inscription : octobre 2010
Messages : 45
Points : 15
Points : 15
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 :
1
2
3
Name          Month        MaxRef
Paris         January       0  
Marseille     February      0

Entrepot1
Code :
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 :
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 :
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.
thisistheend est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h14   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Code :
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.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h59   #3
Futur Membre du Club
 
M H
Inscription : octobre 2010
Messages : 45
Détails du profil
Informations personnelles :
Nom : M H

Informations forums :
Inscription : octobre 2010
Messages : 45
Points : 15
Points : 15
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 .
thisistheend est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h07   #4
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Finger in the nose

Utilise un MERGE .

http://oracle.developpez.com/faq/?page=3-1#merge
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h07   #5
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
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.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h35   #6
Futur Membre du Club
 
M H
Inscription : octobre 2010
Messages : 45
Détails du profil
Informations personnelles :
Nom : M H

Informations forums :
Inscription : octobre 2010
Messages : 45
Points : 15
Points : 15
Génial, ça marche ! J'ai utilisé un MERGE pour arriver à mes fins.
Merci beaucoup pour votre aide, c'était super utile !
thisistheend 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 23h15.


 
 
 
 
Partenaires

Hébergement Web