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 :

Insert or update


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut Insert or update
    Bonjour à tous, je suis confronté à un problème, et mes faibles connaissances en sql ne me permettent pas de faire un choix d'implémentation.

    Tout d'abord j'ai une question préliminaire : je souhaite faire un insert into 'une table'. Le nom de 'une table' etant stocké dans un varchar2. Est ce possible?
    En gros je souhaite paramètrer le nom de ma table destination.

    Je vous explique la situation à laquelle je suis confronté :

    je travaille sous oracle 11g.

    J'ai une fonction qui vient écrire dans des tables de la forme suivante :

    temps(primary key) - calcul1 - calcul2 - calcul3 ...

    La fonction vient écrire un calcul à la fois à partir d'un select qui renvoi temps - calcul(n).

    les intervalles de temps sont fixes et sont les mêmes dans le select que dans la table destination.

    Le insert fonctionne bien pour le premier calcul mais dès lors que je veux écrire le second, je suis obligé de faire un update.

    De plus il est possible qu'à un moment donné je doive écrire un calcul pour un intervalle de temps [t;t+n] alors qu'il existe déjà des données calculées pour cet intervalle.

    Exemple : on me demande d'effectuer le calcul1 de t+1 à t+4 :

    temps - calcul1 - calcul 2
    t --------5
    t+1 ------6
    t+2 ------4
    t+3
    t+4



    Voilà je ne sais pas si c'est clair pour vous, ça l'est pour moi mais c'est normal je suis en plein dedans ... Bref n'hésitez pas à demander des informations si vous en avez besoin.

    En gros je cherche une stratégie pour être sûr que toutes mes lignes seront bien écrites. Je ne sais pas ce qui est le plus cohérent : un traitement par exception, un if exist update else insert ...

    Je prends toutes les suggestions, alors n'hésitez pas !!

    Sur ce bonne journée !

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Merci,

    C'est bien ce que je recherchais. J'ai fais mes tests et ça fonctionne assez bien, mais j'ai un bug, et je n'arrive pas à voir d'où ça vient.

    Ma table destination est composée d'une colonne temps (PK) et de colonnes calculs.

    L'insertion fonctionne uniquement lorsque la table est vide. Quand elle contient au moins une ligne rien ne se passe si des données doivent être insérées.

    Voici mon code :

    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
     
     
    MERGE 
        into table_destination DEST
        using (
              SELECT date_arrondi(date) as times, count(*) as calcul
              FROM source 
              WHERE (date >= to_date(date_start)) 
              AND (date <= to_date(date_end))  
              GROUP BY date_arrondi(date)
              ) SRC
        on (SRC.times >= date_arrondi(date_start))
      WHEN MATCHED 
      THEN
        UPDATE 
        set DEST.comptage = SRC.calcul
        where DEST.time = times
      WHEN NOT MATCHED
      THEN
        INSERT (DEST.TIME, DEST.COMPTAGE )
        values (SRC.times, SRC.calcul);
    avec date_arrondi une fonction qui prend une date et renvoi une date arrondie aux 5 minutes : 12:24:49 => 12:20:00

    Voilà, je compte sur vous pour m'aider à trouver mon erreur.

    bonne soirée à tous

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    Citation Envoyé par kokomaniak Voir le message
    ...
    L'insertion fonctionne uniquement lorsque la table est vide. Quand elle contient au moins une ligne rien ne se passe si des données doivent être insérées.
    ...
    Cela veut dire tout simplement qu’une fois que la table a été chargée les lignes provenant de la source existent toujours dans la destination ! Autrement dit il n’y pas de nouvelle ligne !
    Je n’aime pas votre condition de merge !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (SRC.times >= date_arrondi(date_start))
    Je n’aime pas votre clause where dans le when match
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE DEST.time = times
    Avez-vous bien compris comment ça marche le MERGE ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Effectivement mnitu, je n'avais pas bien compris le fonctionnement. La condition du where était en fait celle du ON. Et le where n'avait pas lieu d'être.

    Merci à tous ceux qui m'ont apporté leur aide.

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

Discussions similaires

  1. [Conception] Formulaires identiques pour INSERT et UPDATE
    Par MiJack dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 16/06/2006, 11h34
  2. performance delete/insert vs update
    Par Dionisos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/08/2005, 18h23
  3. [Debutant] Insert ou update...
    Par kluh dans le forum Oracle
    Réponses: 15
    Dernier message: 13/07/2005, 14h35
  4. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40
  5. [Débutant][PS] modifier un insert en update
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/05/2004, 16h33

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