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

SQL Oracle Discussion :

[O7] Update (simple) mais erreur ORA-01427


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 41
    Par défaut [O7] Update (simple) mais erreur ORA-01427
    Bonjour à tou(te)s,
    Je veux mettre à jour le champ d'une partie d'une table avec ce champ concaténé au champ d'une autre table. C'est pourtant simple non ?
    Eh ben je n'y arrive pas, et je ne trouve pas normal de devoir faire appel à une table intermédiaire pour y parvenir...
    Quelqu'un peut-il m'ouvrir les yeux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table MATERIELS
    FAMILLE (ex 01)
    FICHE (ex 01)
    OBSERVATIONS (ex 10*100)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table TYPE_MATERIEL
    FAMILLE (ex 01)
    FICHE (ex 01)
    CLAIR (ex ARMOIRE)
    Après l'UPDATE je veux dans OBSERVATIONS, ARMOIRE - 10*100. Et bien sûr, sur mes 16000 lignes de MATERIELS, je veux que cela s'applique uniquement sur les familles 01, 03, 10 et les fiches 15, 16 et 17.

    Pas la peine que je vous livre mon script, il ne fonctionne pas.

    Ça vous dit ?

    Par avance merci à la communauté !

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Esaaie ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    UPDATE materiels m
       SET m.observations =
                 (SELECT t.clair
                    FROM type_materiel t
                   WHERE m.famille = t.famille
                     AND m.fiche.t.fiche
                     AND t.famille IN ('01', '03', '10')
                     AND t.fiche IN ('15', '16', '17'))
              || '-'
              || m.observations
     WHERE m.famille IN ('01', '03', '10') AND m.fiche IN ('15', '16', '17');
     
     --COMMIT;-- Il faut vérifier tes données avant de commiter.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 41
    Par défaut
    Oui merci ! Je fais toujours un SAVEPOINT avant...
    Mais non ça ne marche pas (pour l'instant), il n'a pas l'air d'apprécier la concaténation du '-' après le t.clair...
    Pareil, j'ai traduit le m.fiche=t.fiche...
    Ça m'énerve !
    Affaire à suivre... En tout cas merci !

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Essaie ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MERGE INTO materiels m
       USING (SELECT t.famille, t.fiche, t.clair
                FROM type_materiel t
               WHERE t.famille IN ('01', '03', '10')
                 AND t.fiche IN ('15', '16', '17')) t
       ON (    m.famille = t.famille
           AND m.fiche.t.fiche
           AND m.famille IN ('01', '03', '10')
           AND m.fiche IN ('15', '16', '17'))
       WHEN MATCHED THEN
          UPDATE
             SET m.observations = t.clair || '-' || m.observations;

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    Citation Envoyé par akr54 Voir le message
    ...
    Mais non ça ne marche pas (pour l'instant), il n'a pas l'air d'apprécier la concaténation du '-' après le t.clair...
    ...
    Ça marche mais, il faut corriger un peu
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    C:\Users\Marius>sqlplus mni/mni
     
    SQL*Plus: Release 11.2.0.1.0 Production on Mer. Févr. 23 18:41:22 2011
     
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
     
     
    Connecté à :
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    mni@DIANA> create TABLE MATERIELS (
      2    FAMILLE varchar2(10),
      3    FICHE   varchar2(10),
      4    OBSERVATIONS varchar2(100)
      5  )
      6  /
     
    Table créée.
     
    mni@DIANA> insert into MATERIELS values ('01', '01', '10*100')
      2  /
     
    1 ligne créée.
     
    mni@DIANA> insert into MATERIELS values ('01', '02', '10*100')
      2  /
     
    1 ligne créée.
     
    mni@DIANA> insert into MATERIELS values ('02', '01', '12*100')
      2  /
     
    1 ligne créée.
    mni@DIANA> create TABLE TYPE_MATERIEL (
      2    FAMILLE varchar2(10),
      3    FICHE   varchar2(10),
      4    CLAIR       varchar2(30)
      5  )
      6  /
     
    Table créée.
     
    mni@DIANA> insert into TYPE_MATERIEL values ('01', '01', 'ARMOIRE')
      2  /
     
    1 ligne créée.
     
    mni@DIANA> insert into TYPE_MATERIEL values ('01', '02', 'LIT')
      2  /
     
    1 ligne créée.
     
    mni@DIANA> insert into TYPE_MATERIEL values ('02', '01', 'COMMODE')
      2  /
     
    1 ligne créée.
     
    mni@DIANA> commit
      2  /
     
    Validation effectuée.
     
    mni@DIANA> col observations format a40
    mni@DIANA> Select *
      2    From MATERIELS
      3  /
    FAMILLE    FICHE      OBSERVATIONS
    ---------- ---------- ----------------------------------------
    01         01         10*100
    01         02         10*100
    02         01         12*100
     
    mni@DIANA> Select *
      2    From TYPE_MATERIEL
      3  /
     
    FAMILLE    FICHE      CLAIR
    ---------- ---------- ------------------------------
    01         01         ARMOIRE
    01         02         LIT
    02         01         COMMODE
     
    mni@DIANA>
    mni@DIANA> UPDATE materiels m
      2     SET m.observations =
      3               (SELECT t.clair
      4                  FROM type_materiel t
      5                 WHERE m.famille = t.famille
      6                   AND m.fiche   = t.fiche
      7               )
      8            || '-'
      9            || m.observations
     10   WHERE m.famille IN ('01', '03', '10')
     11     AND m.fiche IN ('01', '16', '17')
     12  /
     
    1 ligne mise à jour.
     
    mni@DIANA> Select *
      2    From MATERIELS
      3  /
     
    FAMILLE    FICHE      OBSERVATIONS
    ---------- ---------- ----------------------------------------
    01         01         ARMOIRE-10*100
    01         02         10*100
    02         01         12*100
     
    mni@DIANA>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 41
    Par défaut
    Merci salim11 et surtout merci mnitu pour cette jolie démonstration par l'exemple !
    J'appliquerai ça dès demain mais je peux d'ores et déjà fermer ce post tant c'est limpide...
    Bravo et encore merci à vous deux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] ODP.NET Update génère une erreur ORA
    Par adrien1 dans le forum ADO.NET
    Réponses: 4
    Dernier message: 07/05/2013, 11h50
  2. [MySQL] Requête SQL simple mais erreur
    Par Nesta92 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/11/2012, 10h37
  3. Erreur : ora 01427
    Par sonia5 dans le forum SQL
    Réponses: 7
    Dernier message: 23/11/2010, 12h16
  4. 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, 15h12
  5. Réponses: 6
    Dernier message: 29/11/2005, 19h36

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