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 23/02/2011, 14h28   #1
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
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 :
1
2
3
4
TABLE MATERIELS
FAMILLE (ex 01)
FICHE (ex 01)
OBSERVATIONS (ex 10*100)
Code :
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é !
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 14h57   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Esaaie ce code
Code :
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.
__________________
Publications: http://schelabi.developpez.com/
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 17h11   #3
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
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 !
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h17   #4
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Essaie ce code
Code :
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;
__________________
Publications: http://schelabi.developpez.com/
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h44   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
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 :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/02/2011, 19h34   #6
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
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 !
akr54 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 13h15.


 
 
 
 
Partenaires

Hébergement Web