Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 25/01/2007, 10h35   #1
Invité régulier
 
Inscription : juillet 2003
Messages : 70
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 70
Points : 9
Points : 9
Par défaut ORA-01427: single-row subquery returns more than one row

Bonjour,

Je débute sous Oracle et j'ai voudrais faire un UPDATE sur une table mais sur plusieurs champs et plusieurs enregistrements.
La MAJ de ces enregistrements sont fonction d'un SELECT et donc peuvent changer pour chaque enregistrements.

J'ai fais le SELECT, il fonctionne bien, j'ai fais l'update, il fonction lorsque mon select me ramène qu'un seul enregistrement, mais dès que le select est multi lignes, j'ai le message d'erreur suivant:
ORA-01427: single-row subquery returns more than one row

Je ne comprends pas trop, on dirait que l'update fonctionne que pour mettre à jour la même infos dans tous les enregistrements de la table...

Auparavant, je travaillais sous ACCESS et cela était possible! Je pense qu'il doit y avoir une manip particulière que j'ignore...

Pour info, mon update est du format:

Code :
1
2
3
4
5
6
7
 
UPDATE matable1
SET (champ1, champ2, champ3) =
(SELECT champ4, champ5, Champ6 
FROM matable1, matable2
WHERE condition)
WHERE condition
ob1knob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 10h50   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
C'est une erreur basique :
L'update se fait sur chaque ligne.
Pour chaque ligne, oracle lance le select champ4.. pour mettre à jour les colonnes.

Si ton select ramène plus d'une seule ligne, Oracle n'en choisit pas une au hasard, il sort en erreur.

A toi d'avoir 0 ou 1 ligne dans ton select
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 11h02   #3
Invité régulier
 
Inscription : juillet 2003
Messages : 70
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 70
Points : 9
Points : 9
Merci pour ton aide

mais alors, comment faire pour mettre à jour plusieurs enregistrements avec des infos différentes.

Je m'explique

le resultat de mon select est de la forme
Code :
1
2
3
4
5
6
7
 
TABLE AVEC DONNEE INITIALES            
__________________________            
CDE | LIGN | DATE                              
 
1        1       100107                                    
1        2       150107
Code :
1
2
3
4
5
6
7
 
TABLE APRES UPDATE   
__________________________            
CDE | LIGN | DATE                              
 
1        1       150107                                  
1        2       230107
Le champ date sur TABLE après UPDATE est le résultat de mon select.
Dans mon select, j'ai bien les liens pour retrouver sur quelle ligne appliquer ces résultats.
ob1knob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 12h02   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Il faut que ton select ramène 150107
quand cde = 1 et ligne = 1
ramène 230107
quand cde = 1 et ligne = 2

Code :
1
2
3
4
5
6
7
UPDATE matable1 T1
SET date_cde =
(SELECT date_prev
FROM matable2 T2
WHERE T2.nocde = T1.cde
AND T2.num_ligne = T1.ligne)
WHERE cde = 1
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 15h02   #5
Invité régulier
 
Inscription : juillet 2003
Messages : 70
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 70
Points : 9
Points : 9
Tout à fait. Merci pour ton aide.

En fait je crois que le problème venait du fait que je faisais référence à la table à mettre à jour dans mon from de ma sous requete.

En supprimant cette référence, les enegsitrements ont l'air de bien se mettre à jour même s'il y en a plusieurs.

Je refais des tests. Je reviens vers vous pour vous dire
ob1knob 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 20h16.


 
 
 
 
Partenaires

Hébergement Web