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 :

[8i] question récurrente sur les update/insert


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut [8i] question récurrente sur les update/insert
    Bonjour, bon en fait mon problème est sur la gestion des update et insert, problème récurrent mais dans un cas précis. Je voudrais pouvoir gérer de facon "externe" une insertion si l'id n'existe pas, une mise à jour si elle n'existe pas. J'ai fait pas mal de recherche, mais je ne trouve rien qui répondent parfaitement à mon besoin.
    Actuellement j'utilise une procédure stockée pour faire les mises à jour, si l'id vaut '-1'(valeur reconnaissable), alors je fais l'ajout avec les valeurs qui vont bien,je récupère l'id grace au CURVAL de la table DUAL, et je continue mon traitement. Si l'id est spécifié, alors je fais un UPDATE des champs concernés.

    Le problème avec cette méthode, c'est que je dois spécifier tous les champs, et pas seulement ceux que je veux mettre à jour, ce qui enlève pas mal de souplesse.

    J'avais dans l'idée de plutot faire un trigger "FOR UPDATE", et lorsque l'id n'est pas renseigné, alors il fait automatiquement l'insertion, puis l'update avec le nouvel id précisé.

    Voila, si vous avez des questions, n'hésitez pas. J'attends avec impatience votre avis sur ce point. Merci d'avance

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Un petit exemple pour concrétiser le problème ?

    (Et en passant, DUAL ne contient pas de CURRVAL, pas plus que de SYSDATE. Quand on fait "SELECT sequence.CURRVAL FROM DUAL", cela signifie : pour chaque ligne de DUAL, ramène-moi l'attribut CURRVAL de ma séquence. Comme DUAL contient une seule ligne, le résultat est correct.
    A la limite, vous pourriez prendre n'importe quelle table contenant une seule ligne, et écrire "SELECT sequence.CURRVAL FROM TABLE1LIGNE", et ça marcherait aussi bien.
    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
    SQL> select jobseq.nextval from dual;
     
       NEXTVAL
    ----------
            66
     
    SQL> create table test as select object_name from user_objects where rownum=1;
     
    Table crÚÚe.
     
    SQL> select * from test;
     
    OBJECT_NAME
    --------------------------------------------------------------------------------------------------------------------------------
    ICOL$
     
    SQL> select jobseq.currval from test;
     
       CURRVAL
    ----------
            66
    -- Fin de la parenthèse ! )

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Ok. Donc exemple, actuellement, pour mettre à jour ma table TABLE, j'ai une procédure stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE UPDATE
    (id INTEGER, id_lot INTEGER, id_branche INTEGER, installe INTEGER, test VARCHAR2, charge VARCHAR2, resultat INTEGER, phase VARCHAR2, etat VARCHAR2, num)
    Et pour l'appeler par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE(25, 12, 3, 0, '', '', 0, '', '', 549)
    Dedans, j'ai la disjonction de cas pour savoir si je dois insérer ou mettre à jour, en fonction que l'id vaut -1 ou pas.

    Le problème d'une procédure pour mettre à jour, c'est que par exemple pour mettre à jour uniquement id_lot, je dois fournir tous les autres obligatoirement...

    Ce que je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TABLE SET id_lot = 12 WHERE ID = 25
    Ou dans le cas ou l'enregistrement n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TABLE SET id_lot = 12 WHERE ID = -1
    Dans ce deuxième cas, une insertion dans la table TABLE est effectué, en lui mettant le id_lot à 12.

    Ce genre de solution ferait surement appel à un trigger sur la table TABLE avec un ON BEFORE UPDATE ?

    Bien sur, je ne pense pas qu'une solution comme cela soit possible, mais je voudrais savoir si une méthode s'en rapproche dans l'idée.

    Parenthèse : Ok, merci beaucoup pour cette précision... j'avais pas du tout compris cela, je l'utilisais sans avoir vraiment cherché le fonctionnement derrière. Je comprends que la table DUAL n'a rien à voir maintenant...

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TABLE SET id_lot = 12 WHERE ID = -1
    Dans ce deuxième cas, une insertion dans la table TABLE est effectué, en lui mettant le id_lot à 12.
    Et les autres champs ? tu ne mets rien ?

    Tu as l'instruction MERGE qui existe (fait un update, et si ne trouve pas l'enregistrement, fait un INSERT)


    Edit : Pardon, j'avais pas la version en écrivant : Merge c'est à partir de la 9i

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui les autres champs seraient à null.
    Hélas le merge n'est pas disponible effectivement...

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    tu as regardé du coté de SQL%ROWCOUNT ? Si UPDATE -> 0 ligne traitée alors tu insères

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Hum, et comment le mettre en place ? Dans un trigger after update cela serait possible ?
    Merci de vos propositions

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    à la place de ton code actuel

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Eu oui, mais ca règle pas mon problème, qui est de garder une certaine souplesse pour éditer les données, et donc ne pas passer par une procédure stockée avec les paramètres prédéfinis et obligatoires...
    Ce besoin est du à pas mal de parties du site qui sont en dynamique, et donc je n'ai pas forcément sous la main à tout moment tous les champs de la table.

Discussions similaires

  1. Questions diverses sur les Arbres binaires + insertion d'un fils
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 18/03/2008, 01h21
  2. Question sur les tables inserted et deleted
    Par critok dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/06/2006, 22h03
  3. question générale sur les conteneurs
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2004, 10h11
  4. Question générale sur les affectations ?
    Par Clemaster dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2004, 17h03
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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