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

PL/SQL Oracle Discussion :

Merge non automatique


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Points : 78
    Points
    78
    Par défaut Merge non automatique
    Bonjour,

    Environnement : Base de données Oracle 9

    Dans un schéma, j'ai :
    - une table BOU_TMP qui contient des données provenant d'un autre logiciel. La table est remplie tout les soirs par une suppression des données puis remplissage
    - une table BOU qui sera alimentée avec la table BOU_TMP

    Ces deux tables ont une structure très similaire, à l'exception que dans BOU_TMP j'ai une colonne DATE_COPIE (date de la copie des données de l'autre logiciel) et dans la table BOU j'ai les colonnes USER_CREATION, DATE_CREATION, DATE_MAJ et USER_MAJ

    Je cherche à écrire une commande MERGE qui me permette de mettre à jour la table BOU avec les données de la table BOU_TMP. Lorsque l'INSERT du merge est invoquée je veux alimenter en même temps les colonnes USER_CREATION et DATE_CREATION de ma table BOU. Lorsque la commande UPDATE est invoquée je veux alimenter les colonnes DATE_MAJ et USER_MAJ.

    Dans les deux tables les ID sont identiques.

    Mon problème est lorsque j'utilise le merge, la commande UPDATE est toujours appelée même s'il n'y a pas de modification des valeurs de colonnes et du coup BOU.DATE_MAJ correspond à la date de mon traitement et non pas à la dernière date de modification des données.

    Je souhaiterai savoir, comment écrire mon merge (compatible oracle 9) pour que :
    - si la ligne BOU_TMP n'existe pas dans BOU alors création de la ligne dans BOU
    - si la ligne BOU_TMP existe dans BOU et qu'au moins une des colonnes communes a une valeur différente (valeur différentes, devient null ou n'est plus null) alors mise à jour dans la table BOU
    - si la ligne BOU_TMP existe dans BOU et que les colonnes communes sont toutes de même valeur ou null on fait rien.

    Je vous remercie par avance de votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Si tu ne veux pas que l'update se fasse si les valeurs des colonnes entre les 2 tables sont les mêmes, il faut ajouter une clause WHERE à la fin de la clause update:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MERGE INTO BOU b
    USING BOU_TMP t
    ON (b.id = t.id)
    WHEN MATCHED THEN UPDATE SET b.DATE_MAJ = SYSDATE WHERE t.col1 <> b.col1 AND t.col2 <> b.col2 AND ....

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Points : 78
    Points
    78
    Par défaut
    Mrci pour ta réponse. C'est se que j'ai fait mais avec cette condition, si dans BOU j'ai une valeur NULL et dan BOU_TMP une valeur non NULL l'update ne se fait pas car l'opérateur <> ne se fait pas dans se cas.

    J'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NVL(BOU_TMP.colonne1, '') <> NVL(BOU.colonne1, '')
    Mais ca ne marche pas non plus

    Dois-je obligatoirement faire ca ? n'y a t il pas plus glamour ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE BOU_TEMP.colonne1 <> BOU.colonne1 OR (BOU_TEMP.colonne1 IS NULL AND BOU.colonne1 IS NOT NULL) OR (BOU_TEMP.colonne1 IS NOT NULL AND BOU.colonne1 IS NULL)

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Dans ton NVL n'utilises pas la chaine vide '' car c'est pareil que NULL. Essaie plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NVL(BOU_TMP.colonne1, '#') <> NVL(BOU.colonne1, '#')

Discussions similaires

  1. deselectionner case oui non automatique
    Par Pompier70 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/08/2008, 17h10
  2. Retour-ligne NON-automatique ?
    Par Olaf69 dans le forum Excel
    Réponses: 1
    Dernier message: 02/08/2007, 13h19
  3. envoi "non automatique" d'un doc Excel via email Lotus
    Par marpin dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/06/2007, 14h58
  4. Mise à jour non automatique
    Par benejepo dans le forum Access
    Réponses: 1
    Dernier message: 08/01/2007, 18h11
  5. Réponses: 1
    Dernier message: 01/09/2006, 09h14

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