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 :

Merge avec multiple statement [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut Merge avec multiple statement
    Bonjour mes amis

    Votre humble serviteur requiert votre aide.

    J'ai une requête simple, un merge comme il y a des centaines.
    Pour la clause matched => Je fais un update de ma cible
    Pour la clause not matched => Je fais un insert dans ma cible

    Jusque là, vraiment rien d'extraordinaire. Maintenant, j'aimerais rajouter une condition :
    Si on fait une insertion dans la table cible (donc not matched) j'aimerais aussi faire un update dans ma source (Donc où je fais mon select) pour changer un flag d'une colonne. (Mettre la colonne "exported" à la valeur "true" là où elle a la valeur "false" par défaut)

    Je n'ai pas mis ma requête sachant qu'il s'agit d'une merge totalement classique mais si besoin, je la rajouterais sans soucis.
    J'ai cherché, je n'arrive pas à trouver la possibilité de faire deux update dans la clause "not matched".

    Potentiellement, je peux le faire hors du merge, mais ca rajouterais des lignes dans un script dont je me passerais bien. Donc si vous auriez des idées incroyablement géniales, je suis preneur. Sinon tant pis

    Bisous

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ce n'est pas possible dans une seule instruction.

  3. #3
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonsoir,
    Citation Envoyé par JeanYvette Voir le message
    Si on fait une insertion dans la table cible (donc not matched) j'aimerais aussi faire un update dans ma source (Donc où je fais mon select) pour changer un flag d'une colonne. (Mettre la colonne "exported" à la valeur "true" là où elle a la valeur "false" par défaut)
    Quelle drôle d'idée que de ne flaguer que les lignes qui ont été insérées dans la table "d'en face".
    Existe t'il un fort % de lignes qui ne seront que updatées ?
    Peut importe, c'est pas la question.

    Pour une fois M$ est plus pertinent en fournissant la clause OUTPUT.
    Oracle n'a pas implémenté le RETURNING pour l'instruction MERGE (pourtant dispo pour insert ou update)

    Solutions envisagées :
    1- ré-écrire le MERGE en 2 instructions pour bénéficier de RETURNING
    2- Si la destination à une colonne "date_creation", s'en servir pour identifier les lignes dans la source
    3- Faire une vue pour la destination et créer un trigger "INSTEAD OF insert"

    NB : au passage j'en profiterais pour flaguer les lignes sources qui ont servies à un update car la ligne était déjà présente dans la destination (différents flux).

    Mais bon, pas de miracle.
    Comme pressenti et affirmé par Waldar, pas possible en 1 seule instruction => plus de code

  4. #4
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour,

    Merci à tous, c'est bien ce que je craignais malheureusement.
    Le fait de flaguer ce qui est inséré a été volontairement simplifié de ma part, c'est pour cela que ca peut paraitre étrange.

    J'ai pu faire des recherches hier dans la soirée et je vais surement adapter ce post :
    http://www.oracle-developer.net/display.php?id=220

    Merci pour votre aide

    Bisous

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonsoir,
    Citation Envoyé par JeanYvette Voir le message
    J'ai pu faire des recherches hier dans la soirée et je vais surement adapter ce post :
    [URL="http://www.oracle-developer.net/display.php?id=220"]http://www.oracle-developer.net/display.php?id=220[/URL
    Merci pour ce lien

    Entre toutes les solutions je pense qu'une solution "en 2 temps" (ie identifier les lignes insérées puis mettre à jour la source) sera la plus robuste à la montée en charge tout en étant la plus "maintenable" car le code ne sera pas "caché" au détours d'une instruction.
    Mais ça alourdira le code existant.

    A voir en fonction des réalités terrain.

  6. #6
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour,

    Désolé, je n'avais pas vu ta réponse.
    Quand tu parles de le faire dans le code déjà existant, tu veux dire de le faire sans package du coup ?

    En fait l'avantage du package que je vois c'est qu'il permet un retour en comptant le nombre d'insert/update de fait et qu'il est adaptable. Si je prend la fonction merge counter qui est utilisée, en rajoutant des paramètres autre que c_inserted par exemple, je pourrais palier à de nouveaux problèmes, dans le futur, sur d'autres cas de merge.
    C'est cette partie évolutive qui a fait que cette solution était à mes yeux la meilleure

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonjour,

    Je trouve "l'astuce" super maligne

    Par contre, en m'imaginant avoir à relire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CASE etl.merge_counter(etl.c_inserting)
                  WHEN 0 THEN es.empno
               END
    Je ne sais pas quel aurait été ma réaction.

    Un Case sans aucune alternative, m'aurait très certainement attiré l’œil avec une furieuse envie de simplifier.
    Du coup je serais allé voir le package.
    Essayer de le comprendre le truc par l'appel m'aurait pris un certain temps.

    Donc, à moins de documenter sérieusement chaque appel, je trouve que c'est un piège à la relecture.

    A voir avec vos collègues s'ils ont la même sensibilité que moi.

  8. #8
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Il est vrai que je n'y avais pas pensé. J'ai aussi eu quelque secondes de bug du cerveau quand j'ai lu ça

    J'ai expliqué à mes collègues le principe du package mais je vais peut-être faire une réelle doc écrite pour mieux l'expliquer. Même si il y a de grandes chances que seul moi s'en serve...

    Merci en tout cas pour le conseil, je n'y aurais pas pensé

    Ps : J'ai fait le package et la modification, ca fonctionne comme il faut

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

Discussions similaires

  1. [VBA-A2003] Export d'un Recordset vers Excel, avec SQL statement
    Par Wanoo14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2006, 22h06
  2. insertion avec multiples lignes
    Par f066457 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/03/2006, 23h52
  3. Requête avec multiple clause where
    Par pgenet dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/03/2006, 13h59
  4. Merge avec variables
    Par kluh dans le forum Oracle
    Réponses: 18
    Dernier message: 25/07/2005, 14h31
  5. Erreurs IIS avec Multiples Frames avec xmlrad
    Par powerlog dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/07/2003, 13h15

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