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 :

[Oracle 9.2.] Problème requete "update"


Sujet :

Oracle

  1. #1
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut [Oracle 9.2.] Problème requete "update"
    Bonjour,

    J'ai un souci pour faire une requête de mise a jour, je m'excuse je suis débutante.

    En effet j'ai ma requête qui renvoi plusieurs résultats et je ne sais pas comment faire une procédure pour que ma requête fonctionne.

    Je travaille sous Oracle 9.2.0.5.0

    Voici un exemple type de la requête que je souhaite exécuter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update ma_table 
    set ma_table.champ1 = 
      (select table2.champ1 
      from table2
      where ma_table.champ2 = table2.champ2 
      and table2.champ3 = 821 )
    Merci d'avance pour votre aide.

    Isa

  2. #2
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update ma_table 
    set ma_table.champ1 = 
      (select table2.champ1 
      from table2
      where ma_table.champ2 = table2.champ2 
      and table2.champ3 = 821 )
    Hum, il ne manquerait pas ma_table dans le from de ta sous-requête ?

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

  3. #3
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Bonjour !

    Citation Envoyé par Bahan
    Hum, il ne manquerait pas ma_table dans le from de ta sous-requête ?
    Non, il est récupérer du niveau supérieur, pas de problèmes à ce niveau.

    Par contre je ne comprends pas le problème, la requête est syntaxiquement correcte. Qu'est-ce qui ne te va pas, tu peux donner un exemple avec des données ?
    La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
    -----------------------------------------------------------
    Retrouvez mes articles informatique sur mon Site Developpez.
    Le reste, sur le Site perso !


  4. #4
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben en fait ma requête de sélection retroune plusieurs résultats et j'ai le message :
    [12,47]: ORA-01427: Sous-interrogation ramenant un enregistrement de plus d'une ligne
    .

    En fait il y a tout plein de doublons dans la requête.

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Précise ce que tu veux faire.

  6. #6
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    En fait comme j'ai plusieurs réponse retrounées j'aimerais passer par une procédure, pour pouvoir exécuter ma requête mais je ne sais pas comment faire.

    Sinon y a t'il une autre solution pour que je puisse faire ma mise a jour?

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    En fait comme j'ai plusieurs réponse retrounées j'aimerais passer par une procédure, pour pouvoir exécuter ma requête mais je ne sais pas comment faire.
    Il y a plusieurs réponses retournées par la sous-requête. Laquelle faut-il privilégier ?

  8. #8
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben en fait j'aimerais passer un a un le champs ma_table.champ2 et en fonction avoir le résultat de la sous requête.

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    ???
    Tu fais une requête pour renseigner le champ champ1 dans la table ma_table.

    Le contenu souhaité est obtenu en allant chercher le champ champ1 de la table table2 qui a la même valeur de champ2 et tel que champ3 = 821.

    Plusieurs lignes correspondent à ce critère, mais tu ne peux pas mettre à jour un champ avec plusieurs valeurs

    =>tu peux utiliser un min ou un max par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update ma_table 
       set ma_table.champ1 = (
           select Max(table2.champ1)
             from table2
            where table2.champ2 = ma_table.champ2
              and table2.champ3 = 821 )

  10. #10
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben mes résultats sont différents et j'ai besoin de tous les avoir.

    Avec cette solution je n'ai que le plus grand qui m'est retrourné....

  11. #11
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Il faut utiliser un curseur dans une procédure si tu veux traiter tout tes résultats.

    Je te laisse regarder il y a plein de cours sur developpez à ce sujet
    La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
    -----------------------------------------------------------
    Retrouvez mes articles informatique sur mon Site Developpez.
    Le reste, sur le Site perso !


  12. #12
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben c'est ca mon problème j'ai passé un moment a chercher ce matin, mais je n'en ai pas trouvé qui m'intéresse....

    Pouvez-vous m'indiquer ou en trouver qui correspondent vraiment a ma recherche.

    Merci d'avance.

  13. #13
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Citation Envoyé par Isa31
    Ben mes résultats sont différents et j'ai besoin de tous les avoir.

    Avec cette solution je n'ai que le plus grand qui m'est retrourné....

    Tu ne peux enregistrer qu'une seule valeur pour chaque ligne de la table mise à jour.
    Alors, soit il te manque un moyen d'identifier la ligne à mettre à jour pour chaque valeur retournée par ta sous-requête (un filtre ou une jointure supplémentaire), soit tu souhaites faire une opération sur cette liste de valeurs (somme, concaténation,...) qui n'est pas exprimée...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Isa31
    Ben mes résultats sont différents et j'ai besoin de tous les avoir.

    Avec cette solution je n'ai que le plus grand qui m'est retrourné....
    Tu les veux où ces résultats et sous quelle forme ?
    Tu veux les concaténer dans champ1 avec un séparateur particulier ?
    Une simple jointure ne ferait-elle pas l'affaire ?

  15. #15
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    J'aimerais utiliser une procédure ou des curseurs, mais je ne sais pas comment m'y prendre.

    Et de toute façon je pense qu'il n'y a pas d'autres solutions possible.

  16. #16
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    La question à ce poser est "que veux-tu faire ?"
    pas "comment le faire ?"

  17. #17
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben avec des curseurs....

  18. #18
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Donc en fait, il te suffirait de créer un curseur sur ton select puis de le parcourir et de mettre a jour ta table ma_table, c'est ça ?

    Est-ce que ce serait un truc dans ce genre ?

    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
    DECLARE
        CURSOR c_TonCurseur IS
            SELECT table2.champ1 
            FROM table2, ma_table
            WHERE ma_table.champ2 = table2.champ2 
            AND table2.champ3 = 821;
    BEGIN
        OPEN c_TonCurseur;
        LOOP
            FETCH c_TonCurseur INTO v_Champs1;
                UPDATE ma_table 
                SET ma_table.champ1 = v_Champs1;
        END LOOP;
        CLOSE C_vendeurs;
    END;
    Est-ce que c'est ça (1% de chance) ? Ou suis-je à la ramasse (99% de chance )

    Hum... Je ne comprends pas à quoi sert la requête puisque tu n'as pas de WHERE dans ton UPDATE...

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

  19. #19
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Heu oui en effet je crois qu'il me manque une condition dans mon select.

    Par contre mon where dans la mise a jour dépend elle aussi des deux tables...

  20. #20
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    bon alors j'ai fait ca mais j'ai des erreurs ....

    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
    DECLARE
        v_champ1 VARCHAR2(15);
        v_champ2   VARCHAR2(15);
        CURSOR c_Curseur IS
            SELECTtable2.champ1, table2.champ2 
            FROM table2, ma_table
            WHERE ma_table.champ2 = table2.champ2 
            AND table2.champ3 = 821;
    BEGIN
        OPEN c_Curseur;
        LOOP
            FETCH c_Curseur INTO v_champ1, v_champ2 ;
                UPDATE ma_table 
                SET ma_table.champ1 = v_Champs1
                WHERE ma_table.champ2  = v_champ2;
        END LOOP;
        CLOSE C_Curseur;
    END;

    Et j'ai le message suivant
    Continue statuts <> 0
    Je ne vois pas ou est mon erreur...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [Oracle] Probleme dans l'exécution de requetes
    Par Floverdoz dans le forum Bases de données
    Réponses: 10
    Dernier message: 14/06/2005, 19h03
  2. [sgbd] [Oracle] Pb d'execution d'une requete
    Par linou dans le forum SGBD
    Réponses: 5
    Dernier message: 15/03/2005, 18h01
  3. oracle 8.1.7, CLOB et requete avec like
    Par fsapet dans le forum Oracle
    Réponses: 5
    Dernier message: 15/02/2005, 12h45

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