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

DB2 Discussion :

sqlcode -407 sur update


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Par défaut sqlcode -407 sur update
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE DPRO.I928 B                                       
      SET B.DTENSO =   (SELECT MIN(A.DTENSO) FROM DPRO.I928 A
                        WHERE                                
                            A.NUCE = B.NUCE                  
                        AND A.COCXBQ = B.COCXBQ              
                        AND A.CDSOLE = B.CDSOLE              
                        AND A.NUPER  = B.NUPER               
                        AND A.DTENSO < B.DTENSO              
                        AND A.CTETSO = 'A'                   
                        AND B.CTETSO = 'A');

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Il faut faire :

    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
    UPDATE DPRO.I928 B 
    SET B.DTENSO = (SELECT MIN(A.DTENSO) FROM DPRO.I928 A
    WHERE 
    A.NUCE = B.NUCE 
    AND A.COCXBQ = B.COCXBQ 
    AND A.CDSOLE = B.CDSOLE 
    AND A.NUPER = B.NUPER 
    AND A.DTENSO < B.DTENSO 
    AND A.CTETSO = 'A' 
    AND B.CTETSO = 'A')
    Where exists (SELECT * FROM DPRO.I928 A
    WHERE 
    A.NUCE = B.NUCE 
    AND A.COCXBQ = B.COCXBQ 
    AND A.CDSOLE = B.CDSOLE 
    AND A.NUPER = B.NUPER 
    AND A.DTENSO < B.DTENSO 
    AND A.CTETSO = 'A' 
    AND B.CTETSO = 'A');

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Ou bien, plus sioux mais aussi plus difficile à appréhender.

    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
    UPDATE DPRO.I928 B 
    SET B.DTENSO = CASE WHEN 
    ((SELECT MIN(A.DTENSO) FROM DPRO.I928 A 
    WHERE 
    A.NUCE = B.NUCE 
    AND A.COCXBQ = B.COCXBQ 
    AND A.CDSOLE = B.CDSOLE 
    AND A.NUPER = B.NUPER
    AND A.DTENSO < B.DTENSO
    ) IS NOT NULL
    AND A.CTETSO = 'A' 
    AND B.CTETSO = 'A')
    THEN 
    (SELECT MIN(A.DTENSO) FROM DPRO.I928 A 
    WHERE 
    A.NUCE = B.NUCE 
    AND A.COCXBQ = B.COCXBQ 
    AND A.CDSOLE = B.CDSOLE 
    AND A.NUPER = B.NUPER
    AND A.DTENSO < B.DTENSO 
    AND A.CTETSO = 'A' 
    AND B.CTETSO = 'A') 
    ELSE B.DTENSO
    END

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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 ?

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    En DB2 z/OS (espérons que ça soit cette plate forme ... ) on a pour le -407 :

    AN UPDATE, INSERT, OR SET VALUE IS NULL, BUT THE OBJECT COLUMN column-name CANNOT CONTAIN NULL VALUES

    Explanation

    One of the following conditions occurred:

    •A null insert or update value was specified for a column defined as NOT NULL.

    •A SET transition variable statement specified a NULL value for column defined as NOT NULL without the WITH DEFAULT clause in the table definition.

    •The update or insert value was DEFAULT, but the object column was declared as NOT NULL without WITH DEFAULT in the table definition. Consequently:
    ◦A default value of NULL cannot be inserted into that column.
    ◦An update cannot set default values of NULL in that column.
    ◦A SET transition variable statement in a trigger cannot set default values of NULL in that column.

    •The column name list for the INSERT statement omits a column declared NOT NULL and without WITH DEFAULT in the table definition.

    •The view for the INSERT statement omits a column declared NOT NULL and without WITH DEFAULT in the base table definition.
    •A null insert value was specified for a ROWID column.

    System action

    The statement cannot be executed. The 'column-name' might be returned in the SQLCA, depending on the syntax of the SQL statement in which the error was detected
    Programmer response

    Examine the definition of the object table to determine which columns of the table have the NOT NULL attribute or have a type of ROWID, and correct the SQL statement accordingly.
    Moi je pense tout simplement que la table résultante sur laquelle s'applique la fonction MIN est vide et que par conséquent la fonction retourne un NULL qui ne peut être stocké dans la colonne à gauche du SET puisque cette dernière n'accepte pas le NULL ...

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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.

Discussions similaires

  1. [VB.NET] Pb sur update à partir champs Textbox
    Par patdez dans le forum ASP.NET
    Réponses: 5
    Dernier message: 28/06/2006, 09h28
  2. [MySQL] pb sur update
    Par yayacameleon dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/11/2005, 16h32
  3. Réponses: 1
    Dernier message: 06/10/2005, 10h09
  4. lock sur update
    Par jacques trepp dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/06/2005, 10h36
  5. Evenement sur UPDATE, INSERT, DELETE
    Par papouAlain dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/12/2004, 14h58

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