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

Oracle Discussion :

ORA-01427: single-row subquery returns more than one row


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 70
    Points : 38
    Points
    38
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update matable1
    set (champ1, champ2, champ3) =
    (select champ4, champ5, Champ6 
    from matable1, matable2
    where condition)
    where condition

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TABLE AVEC DONNEE INITIALES            
    __________________________            
    CDE | LIGN | DATE                              
     
    1        1       100107                                    
    1        2       150107
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il faut que ton select ramène 150107
    quand cde = 1 et ligne = 1
    ramène 230107
    quand cde = 1 et ligne = 2

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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    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

Discussions similaires

  1. Erreur ORA-01427 single-row subquery returns more than one row
    Par SmileAndFly dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/08/2008, 16h12
  2. Réponses: 5
    Dernier message: 01/02/2008, 11h07
  3. Réponses: 14
    Dernier message: 15/11/2007, 11h22
  4. Réponses: 3
    Dernier message: 08/12/2006, 18h28
  5. ORA-01427: single-row subquery returns more than one row
    Par hadid dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2006, 16h35

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