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 :

[SQL] update avec decode


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut [SQL] update avec decode
    Bonsoir à tous,

    Voilà ma question :
    "est ce que l'on peut utiliser la fonction decode de oracle sans select "
    J'illustre ma question avec un exemple, qui ne fonctionne pas pour moi, mais je ne sais pas où est ma source d'erreur (il n'y a pas de message d'erreur, mais aucune mise a jour n'est faite):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update foustock set ttc=round( decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6,2)) 
    where (stock,fou) in (select code,fou from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    Merci d'avance pour répondre à ma question et eventuellement si vous voyez mon "erreur de logique", de me dire où elle est.

    La mise a jour ne se fait pas ??
    Comme je disais plus haut, je n'ai pas de message d'erreur, mais j'ai l'impression qu'aucune ligne n'est affectée.

  2. #2
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    Non, le Decode est une fonction SQL. En PL, il faudra passer par des IF ou CASE, ou bien creer des fonctions stockees.

    A propos de la mise a jour. peut-etre que je jeu d'essai n'est pas correct ou que les elements en jointure ne sont pas les bons. Joindre deux tables avec des colonnes portant des noms differents est de nature suspecte.

    Merci de veiller a presenter des testcases *COMPLETS*. Ca evite de passer du temps a reproduire les problemes.

    En toute etat de cause, le testcase suivant produit des mises a jour:

    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
     
    DROP TABLE foustock
    /
    DROP TABLE stock
    /
    CREATE TABLE foustock 
    (ttc        INTEGER
    ,fou        INTEGER
    ,stock      INTEGER)
    /
    CREATE TABLE stock 
    (code       INTEGER
    ,fou        INTEGER)
    /
    INSERT INTO stock    VALUES (1,123);
    INSERT INTO foustock VALUES (100,123,1);
     
    SELECT *
    FROM   foustock
    /
    update foustock set ttc=round( decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6,2)
    where (stock,fou) in (select code,fou from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    /
     
    SELECT *
    FROM   foustock
    /
    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
     
    SQL> @fou
     
    Table dropped.
     
     
    Table dropped.
     
     
    Table created.
     
     
    Table created.
     
     
    1 row created.
     
     
    1 row created.
     
     
           TTC        FOU      STOCK
    ---------- ---------- ----------
           100        123          1
     
     
    1 row updated.
     
     
           TTC        FOU      STOCK
    ---------- ---------- ----------
          2060        123          1
     
    SQL>

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut merci pour ta réponse plabrevo
    Je tiens à préciser que je souhaiterais me passer de procedure stockée et ne faire que des "requetes simples".

    Sinon, j'ai suivit tes conseils,

    un exemple simple de mise à jour avec decode fonctionne sans le select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update table set col1=decode(col1,null,0,col1)
    ,
    les colonnes null sont mise a jour.

    Il ne reste plus qu'à savoir pourquoi ce n'est pas mis a jour

  4. #4
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    j'ai l'impression qu'aucune ligne n'est affectée.
    Il ne reste plus qu'à savoir pourquoi ce n'est pas mis a jour
    C'est quoi exactement qui n'est pas mis a jour? Sous SQL*Plus le nombre de record mis a jour est affiche clairement au format suivant:

    <?> row updated.
    Si le nombre de records maj est 0, cela signifie que le predicat de la clause WHERE est incorrect.

    En ce qui concerne les bonnes pratiques de programmation sous PL/SQL, les procedures stockes sont beaucoup plus lisible et faciles a maintenir que les couches de DECODE imbriquees les unes dans les autres.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Si aucune ligne n'est mise à jour, il convient plutôt de vérifier la clause where que le decode.

    Citation Envoyé par plabrevo
    En ce qui concerne les bonnes pratiques de programmation sous PL/SQL, les procedures stockes sont beaucoup plus lisible et faciles a maintenir que les couches de DECODE imbriquees les unes dans les autres.
    Hum, la lisibilté d'une requête n'est pas en général pas le soucis principal... La performance me semble bien plus important. Et je ne suis pas persuadé que faire plusieurs update dans une procédure stockée pour éviter un (des) decode soit plus performant que de faire des decode en une seule requête.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Fais juste un select pour voir combien de lignes tu ramènes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ttc, round( decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6,2)) 
    FROM foustock
    where (stock,fou) in (select code,fou from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    D'ailleurs c'est pas optimisé ce code
    Pas de IN si tu fait la jointure dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ttc, round( decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6,2)) 
    FROM foustock 
    WHERE EXISTS (select 1 from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Toutes mes excuses
    Je vous demande de m'excuser, la requete que j'ai mis est LA solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update foustock set ttc=round( decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6,2)
    where (stock,fou) in (select code,fou from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    L'erreur provient des parenthèses supplémentaire que j'avais mis originalement pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6)
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update foustock set ttc=round(  (decode(ttc,null,0,'',0,ttc)+decode(ttc,null,0,'',0,ttc)*19.6),2  )
    where (stock,fou) in (select code,fou from stock where foustock.stock=stock.code and foustock.fou=stock.fou)
    et quand je vous ai demandé de l'aide, j'ai réecrit la requete sans mettre les parenthèse.

    Encore déssolé

  9. #9
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    Hors-sujet mais:
    Hum, la lisibilté d'une requête n'est pas en général pas le soucis principal... La performance me semble bien plus important. Et je ne suis pas persuadé que faire plusieurs update dans une procédure stockée pour éviter un (des) decode soit plus performant que de faire des decode en une seule requête.
    La maintenance represente 75% du cout d'un development. Je prefere un code robuste, structure, lisible, facile a maintenir qu'un code genial, non reutilisable, peut-etre performant sur le requirement initial, mais qui me coutera une fortune a re-ecrire pour absorber les evolutions qui ne manqueront pas de survenir dans le futur. Parce qu'evidemment, entre-temps, le developpeur genial aura quitte mon equipe.
    La performance de l'application, elle, sera principalement conditionnee par les choix d'architecture et de modele de donnees.

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

Discussions similaires

  1. [SQL]UPDATE avec JOIN
    Par sempire dans le forum DB2
    Réponses: 3
    Dernier message: 03/11/2009, 13h21
  2. Petit défi SQL (Update avec condition)
    Par Angeldu74 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 03/03/2009, 12h55
  3. Pb requete sql update avec jdbc
    Par nickyla dans le forum JDBC
    Réponses: 3
    Dernier message: 09/09/2008, 13h39
  4. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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