|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 1 ![]() |
Bonjour,
L'ordre update suivant me renvoit un sqlcode -407. Est-ce que quelqu'un peut m'aider, tout en sachant que je ne peux créer de table intermédiaire. Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
Il faut faire :
Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Ou bien, plus sioux mais aussi plus difficile à appréhender.
Code :
|
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Pour des raisons de perf la 2eme méthode je ne l'utiliserai pas (forcer un update sur toute la table alors qu'il n'y en a pas besoin), sans compter que la requête risque d'engendrer 2 sous requête sur la même table non ?
|
|
|
10
|
|
|
#5 | |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 096 ![]() |
En DB2 z/OS (espérons que ça soit cette plate forme ... ) on a pour le -407 :
Citation:
|
|
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
y a une valeur null car son update n'a pas de clause where.
Du coup quand il fait son case il ne couvre pas toutes les possibilités. Chose fixée par k2r et mercure Qui plus est avec une clause where si il n'y aucune ligne à updater, le sgbd ne fera rien, et ne retournera pas d'erreur. |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 096 ![]() |
Je parle du SELECT pas de l'UPDATE.
Citation:
Citation:
On parle bien de l'ordre donné dans le premier message non ? |
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
pardon oui j'ai mélangé les deux mais la démarche reste la même.
son sous-select dans son update ne va trouver que des valeurs selon la clause where de son sous-select. Ceci va engendrer des valeurs null pour les enregistrements que son sous-select ne prend pas en compte (vu qu'il fait un update de toute la table) Rajouter une clause where à son update fixera ce problème car le sous-select trouvera systématiquement les valeurs, et de ce fait, si la table est vide, il n'updatera rien donc aucune erreur. edit: donc sur le principe de l'erreur je suis entièrement d'accord avec vous (null value), par contre sur le fait que la table initial soit vide, je ne suis pas forcément d'accord |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 096 ![]() |
Pour moi, c'est la définition même du -407. Le MIN ou le MAX de rien c'est pas défini, donc c'est NULL en SQL et vice versa ...
|
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
DB2 z/OS ou DB2 System i, même combat. SQL renvoie le code SQL407 pour les mêmes raisons : à savoir qu'il ne peut pas mettre la valeur NULL dans une colonne qui n'accepte pas la valeur nul. Et, effectivement, la valeur renvoyée est nulle s'il n'y a pas correspondance dans le prédicat WHERE qui joint les deux tables, même si en fait il s'agit ici de la même table qui est jointe mais considérée par SQL comme s'il y avait deux tables distinctes.
Citation:
|
|
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : octobre 2006 Messages : 502 ![]() |
bonjour
la requete de base est fausse, ou du moins très incomplète. On maj une colonne sans sélection, avec une sous-requete qui reprend la meme colonne de la même table. Si la demanderesse pouvait s'exprimer... |
|
|
00
|
|
|
#12 | ||
|
Membre actif
![]() Inscription : juin 2008 Messages : 146 ![]() |
Bonsoir,
Par rapport à tous les échanges, la 1ère réponse de K2R400 parait tout à fait répondre au besoin. Ceci dit, la spécificité de cette requête c'est qu'on fait un UPDATE avec une ss-requête sur la même table. Le -407 est du aux lignes de la table pour lesquelles DB2 ne trouve pas de lignes dans la ss-requête. Et le seul prédicat qui empêche de trouver, c'est "AND A.DTENSO < B.DTENSO". En supprimant ce prédicat, il y a donc possibilité d'éviter de faire une 2ème ss-requête avec l'ajout de la clause WHERE, mais la contrepartie est qu'on fera plus de mise à jour que prévu, vu que même les lignes qui ont déjà la date minimum seront mises à jour. Ca pourrait donner : Code :
Il y a de nombreux paramètres qui vont rentrer en ligne de compte tel le LOCKSIZE de ton tablespace. A ce propos, avant de passer ce type de requête qui peut générer de nombreuses maj sans possibilité de COMMIT intermédiaire, ne pas hésiter à se servir de l'ordre LOCK TABLE I928 IN EXCLUSIVE MODE. C'est bien sur à utiliser avec parcimonie puisque cela bloque tout accès concurrent, c'est donc générateur de contentions. Mais cela peut diviser les temps de réponse d'une telle requête par un facteur non négligeable puisque DB2 n'a plus qu'à gérer un seul verrou. Si tu n'es pas en LOCKSIZE ANY, cad sans possibilité de faire du LOCK ESCALATION, cela peut même être obligatoire, sinon tu risques d'atteindre le nombre maxi de LOCK acceptés pour une tache et ta requête va planter par -904 chaque fois que tu la relanceras. Et si tu es en LOCKSIZE ANY, cela évite de gérer des milliers de verrous jusqu'au LOCK ESCALATION, qui, au final, va également bloquer toute la table (cqfd, autant anticiper et ne pas perdre de temps...). Bonne utilisation et n'hésite pas à nous tenir au courant. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com