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 :

tester l'existence d'une table + merge via dblink


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut tester l'existence d'une table + merge via dblink
    Bonjour à tous,

    J'ai une instance de base Oracle de production qui contient toutes mes données de production (schéma PRODUCTION) et une instance de base infocentre qui contient tous mes indicateurs calculés et historisés (schéma INFOCENTRE). Cette dernière a un dblink vers la base de production DBPROD_LNK.

    Pour calculer les indicateurs à partir des données de production puis les mettre à jour dans l'infocentre, je passe par une table temporaire TB_TEMP avant de stocker le résutat définitif dans la table TB_RESULT.

    Voici le code correspondant:
    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
     
    -- 1. création d'une table temporaire pour utiliser le merge (db_link interdit)
    DROP TABLE infocentre.tb_temp;
    CREATE TABLE infocentre.tb_temp AS 
       SELECT * FROM infocentre.tb_result WHERE 1=0;
     
    -- 2. ajout des indicateurs dans la table temporaire
    INSERT INTO infocentre.tb_temp (annee,mois,indic1,indic2,datecalcul) SELECT annee,mois,sum(valeur1),count(valeur2),sysdate
    FROM production.tb_donnees@dbprod_lnk
    GROUP BY annee,mois; 
     
    -- 3. mise à jour des indicateurs à partir de la table temp
    MERGE INTO infocentre.tb_result TbResult
     USING (SELECT annee, mois, indic1, indic2, datecalcul     
       FROM infocentre.tb_temp) TbTemp 
     ON (TbResult.annee = TbTemp.annee AND TbResult.mois = TbTemp.mois)
    WHEN MATCHED THEN
     UPDATE SET TbResult.indic1 = TbTemp.indic1, 
       TbResult.indic2 = TbTemp.indic2, 
       TbResult.sysdate = TbTemp.sysdate;
     
    -- 4. suppression de la table temporaire (db_link interdit le merge...)
    DROP TABLE infocentre.tb_temp;
    La 1ère requête me permet de tester l'existence préalable de la table temporaire à créer (précaution si l'exécution précédente du script a planté).
    Elle me renvoie une erreur car normalement cette table n'existe pas déjà dans le schéma INFOCENTRE.

    Mes questions sont les suivantes :
    1. comment faire pour tester l'existence préalable d'une table et soit la créer si elle n'existe pas soit faire un truncate si elle existe avec la même structure soit encore faire un drop si elle existe mais avec une structure différente ?

    2. avez-vous une autre solution pour faire un merge entre des instances Oracle différentes ?

    Merci beaucoup à tous pour votre aide précieuse,
    MarieO

  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
    Quelques étrangetés quand même.
    Pourquoi DROP / CREATE table à chaque fois ?
    La structure de votre table de production change souvent ?

    Dans votre MERGE vous faites une sous-requête, mais cette dernière n'est pas nécessaire.
    Vous avez une sortie en UPDATE mais pas en INSERT, comment gérez-vous les nouveaux mois ?

    Sinon je viens de tester sur une 11g, le MERGE avec un dblink fonctionne.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut
    Il arrive que la structure de la table change, c'est pourquoi j'ai fait un DROP suivi d'un CREATE...

    Par ailleurs, afin de simplier le code donné en exemple, je n'ai pas repris l'intégralité de la requête telle qu'elle est écrite dans le script sql.
    Ceci explique la sous-requête qui ne semble pas nécessaire ainsi que l'absence de UPDATE pour les lignes nouvelles qui ont une autre origine que la requête utilisée dans le merge.

    Pour information, je suis en 10gR2. C'est peut-être pour cela que le merge ne fonctionne pas...

    Si quelqu'un a une solution (ou des solutions) à proposer, je suis preneuse.

    MarieO

  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 marieo Voir le message
    ...
    Pour information, je suis en 10gR2. C'est peut-être pour cela que le merge ne fonctionne pas...

    ...
    The bug was fixed in 11.0, and backported to 10.2.0.2 and 10.2.0.3.
    Mettez aussi le message d'anomalie.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut
    The bug was fixed in 11.0, and backported to 10.2.0.2 and 10.2.0.3.
    Merci pour cette information, je vais aller demander à notre DBA...

    Par contre, cela ne répond pas à ma question sur comment tester l'existence d'une table...


    MarieO

  6. #6
    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
    Il suffit d'interroger la vue SYS.ALL_TABLES.

Discussions similaires

  1. Tester l'existence d'une table avec une requête
    Par Oluha dans le forum Access
    Réponses: 6
    Dernier message: 29/08/2005, 09h45
  2. Tester l'existence d'une table sous Access
    Par Oluha dans le forum Bases de données
    Réponses: 10
    Dernier message: 29/08/2005, 09h42
  3. tester l existance d une table
    Par mick84m dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/04/2005, 11h24
  4. [JDBC]Tester l'existence d une table
    Par juflata dans le forum JDBC
    Réponses: 7
    Dernier message: 29/06/2004, 15h27
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

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