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 21/12/2011, 17h16   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 11
Points : 3
Points : 3
Par défaut UPDATE, JOIN ORA-00933

Bonjour,

C'est un sujet qu'on trouve à la pelle sur internet mais malgré tous mes essais je ne me sors pas de ce problème.

Je suis en train de faire des reprises de données en passant par une base en Oracle 11g.

J'essaye de mettre à jour une zone clef d'une table par une valeur se trouvant dans une autre table.

J'ai essayé
Code :
1
2
3
UPDATE X3_ITMFACILIT ITF 
SET ITF.ITMREF = (SELECT ITM.ITMREF FROM X3_ITMMASTER ITM WHERE ITM.CODE_SOC1 = ITF.OLDCOD);
WHERE ITF.STOFCY= 'SOR';
Là j'avais une erreur en valeur NULL.

Ok le code n'était pas très claire.
J'ai donc fait ceci :
Code :
1
2
3
4
5
6
7
 
UPDATE X3_ITMFACILIT 
SET ITMREF = ITM.ITMREF 
FROM X3_ITMFACILIT ITF 
JOIN X3_ITMMASTER ITM 
ON (ITF.OLDCOD = ITM.CODE_SOC1) 
WHERE ITF.STOFCY= 'SOR';
Là j'ai un ORA-00933 sur SQL qui ne se termine pas correctement

Et j'ai donc terminé par :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
UPDATE
(
 SELECT 
        ITF.ITMREF,
        ITM.ITMREF 
 FROM 
      X3_ITMFACILIT ITF
      LEFT OUTER JOIN X3_ITMMASTER ITM
      ON (ITF.OLDCOD = ITM.CODE_SOC1)
      WHERE ITF.STOFCY= 'SOR' 
)
SET ITF.ITMREF = ITM.ITMREF;
Et là j'ai une erreur ORA-00904 comme quoi mon ITM.ITMREF identificateur invalide

Je ne sais pas trop à quel bord me raccrocher, si quelqu'un aurait une idée !
Merci par avance
Dams63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 17h26   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
À partir de la première requête :
Code :
1
2
3
4
UPDATE X3_ITMFACILIT ITF 
   SET ITF.ITMREF = (SELECT ITM.ITMREF FROM X3_ITMMASTER ITM WHERE ITM.CODE_SOC1 = ITF.OLDCOD);
 WHERE ITF.STOFCY = 'SOR'
   AND EXISTS (SELECT NULL FROM X3_ITMMASTER ITM WHERE ITM.CODE_SOC1 = ITF.OLDCOD);
Ou avec MERGE :
Code :
1
2
3
4
5
6
MERGE INTO X3_ITMFACILIT ITF 
USING X3_ITMMASTER ITM
   ON (ITM.CODE_SOC1 = ITF.OLDCOD)
 WHEN MATCHED THEN UPDATE
  SET ITF.ITMREF =  ITM.ITMREF
WHERE ITF.STOFCY = 'SOR';
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 17h28   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
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 313
Points : 5 817
Points : 5 817
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
UPDATE
(
 SELECT 
        ITF.ITMREF AS New_ITMREF,
        ITM.ITMREF AS Old_ITMREF
 FROM 
      X3_ITMFACILIT ITF
      JOIN 
      X3_ITMMASTER ITM
  ON (ITF.OLDCOD = ITM.CODE_SOC1)
      WHERE ITF.STOFCY= 'SOR' 
)
SET New_ITMREF = Old_ITMREF
Ou utilisez Merge.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 09h35   #4
Invité de passage
 
Inscription : juillet 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 11
Points : 3
Points : 3
Merci beaucoup.

Donc seul le merge fonctionne.
La 1ère me sort une erreur ORA-01407 : impossible de mettre à jour avec NULL

Et la requête de "mnitu" me dit ORA-01779 : impossible de modifier une colonne d'une table ne contenant pas de clef alors qu'elle est bien présente ...

Donc merci pour le MERGE, le seul hic c'est qu'à chaque fois que je le lance ça me plante ma BD, il faut que je redémarre son service pour la réactiver :s
Mais la MAJ fonctionne.
Dams63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 10h09   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
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 313
Points : 5 817
Points : 5 817
Citation:
Envoyé par Dams63 Voir le message
...Et la requête de "mnitu" me dit ORA-01779 : impossible de modifier une colonne d'une table ne contenant pas de clef alors qu'elle est bien présente ...
Key-preserved table concept in join view
Update JOIN : MERGE vs (in-line)view update !
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2011, 10h34   #6
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
La mise en forme est exécrable sur ton deuxième lien, j'espère que le blogger en question fera un jour l'effort de soigner un peu cela
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 10h58   #7
Invité de passage
 
Inscription : juillet 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 11
Points : 3
Points : 3
Si je comprends bien, cela voudrait dire que pour 1 ITF.ITMREF j'ai plusieurs ligne de ITM.ITMREF ?

Ou alors que mon ITF.OLDCOD soit plusieurs fois dans ITM.CODE_SOC1 ?

Hors cela est juste impossible !
Je n'ai aucun doublon sur ITM.CODE_SOC1

Comprends pas

Edit :

Finalement la requete :
Code :
1
2
3
4
UPDATE X3_ITMFACILIT ITF 
   SET ITF.ITMREF = (SELECT ITM.ITMREF FROM X3_ITMMASTER ITM WHERE ITM.CODE_SOC1 = ITF.OLDCOD)
 WHERE ITF.STOFCY = 'SOR'
   AND EXISTS (SELECT NULL FROM X3_ITMMASTER ITM WHERE ITM.CODE_SOC1 = ITF.OLDCOD);
A fonctionné, j'avais du mal faire un copié/collé

Merci à vous
Dams63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 11h50   #8
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
En fait, ce que te disent les liens de Mnitu, c'est qu'il ne suffit pas qu'il n'y ait concrètement pas de doublon pour l'update de la vue : il faut qu'il y ait une contrainte d'unicité explicite pour le prouver !
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann 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 05h44.


 
 
 
 
Partenaires

Hébergement Web