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 :

Actualiser une table en fonction d'une autre [11gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut Actualiser une table en fonction d'une autre
    Bonjour je suis face au problème suivant et je sollicite votre aide.
    J'ai sur deux serveurs oracle (orcl1 et orcl2) la même table compagnie avec la structure suivante.


    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
     
    compagnie_orcl1
     
    username | id | compagnie| seq
    --------------------------------------
    USER1     |us1id1| CMR| 123
    USER1     |us1id1| RWD| 456
    USER1     |us1id1| SING| 789
    USER1     |us1id1| CNG | 1011
    ------------------------------------
    USER2     |us2id2| SEN | 1213
    USER2     |us2id2| CND | 1415
    USER2     |us2id2| CGT | 1617
    USER2     |us2id2| CNG | 1819
    USER2     |us2id2| KPG | 2021
    ------------------------------------
    USER3     |us3id3| RWD| 2223
    USER3     |us3id3| CND | 2425
    USER3     |us3id3| CID  | 2627
    USER3     |us3id3| CNG | 2829
    USER3     |us3id3| SING| 3031
    sa copie sur le serveur2 (orcl2)

    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
     
    compagnie_orcl2
    username | id | compagnie |seq
    -------------------------------------
    USER1     |us1id1| RWD|0010
    USER1     |us1id1| SING|0011
    USER1     |us1id1| CNG |0012
    ------------------------------------
    USER2     |us2id2| SEN|0013
    USER2     |us2id2| CNG|0014
    USER2     |us2id2| KPG|0015
    -----------------------------------
    USER3     |us3id3| RWD|0016
    USER3     |us3id3| CND|0017
    USER3     |us3id3| SING|0018
    J'aimerai pouvoir ajouter dans la table compagnie_orcl2 toutes les lignes de la table compagnie_orcl1 commencant par "C" et qui n' y sont pas encore.
    merci pour votre aide

  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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into compagnie_orcl2 (username, id, compagnie)
    select c1.username, c1.id, c1.compagnie
      from compagnie_orcl1 c1
     where c1.compagnie like 'C%'
       and not exists (select 1
                         from compagnie_orcl2 c2
                        where c1.username  = c2.username 
                          and c1.id        = c2.id
                          and c1.compagnie = c2.compagnie)

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Si tu as un DBLINK, il est parfois plus rapide de le gérer en MINUS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO COMPAGNIE_ORCL2@db2 (username, ID, compagnie)
    SELECT username, ID, compagnie
    FROM COMPAGNIE_ORCL1
    WHERE (username, ID, compagnie) IN 
      (SELECT username, ID, compagnie FROM COMPAGNIE_ORCL1  WHERE compagnie LIKE 'C%'
      MINUS
      SELECT username, ID, compagnie FROM COMPAGNIE_ORCL12@db2 WHERE compagnie LIKE 'C%'
      )

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    skuatamad et McM merci pour vos réponses.

    skuatamad par ce qu'avec ta solution j'ai eu 278 lignes en retour je me suis décidée à faire l'insertion avec un curseur comme suit:

    **** Correction j'ai actualisée la table en ajoutant la colonne seq que j'avais oubliée.****


    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    create or replace function comp (p_error OUT VARCHAR2)
    RETURN BOOLEAN
    is
     
    cursor compa_cur is
     
    select * from compagnie_orcl1@orcl1 c1
     
    where c1.compagnie like 'C%'
       and not exists (select 1
                         from compagnie_orcl2 c2
                        where c1.username  = c2.username 
                          and c1.id   = c2.id
                          and c1.compagnie = c2.compagnie);
     
    compa_tmp compa_cur%ROWTYPE;
     
    begin
     
    open compa_cur ;
     
    loop
     
    fetch compa_cur into compa_tmp;
     exit when compa_cur%NOTFOUND;
     
    insert into compagnie_orcl2 (USERNAME, 
                         compagnie,  
                         id, 
                         Seq)
     
    values (compa_cur.username,
            compa_cur.compagnie,
             compa_cur.id,
            Seq_cmp.nextval);
        commit; 
     
       end loop;
     
            close compa_cur;
       return true; 
    end comp;
    seulement l'insertion ne fonctionne pas telle que je veux. c' est à dire que pour un enregistrement une seule des lignes commencant par 'C' sera insérée et pas les autres.
    j'ai l'impression que la récursion ne fonctionne pas.

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Pourquoi utiliser un curseur alors qu'une instruction ensembliste fait l'affaire et sera bien plus efficace ?
    Par ailleurs l'abus de COMMIT est à éviter, dans votre code vous en effectuez un à chaque boucle ce qui est très contre-productif.

    Sinon la fonction compile ?
    Je trouve étonnant qu'une fonction ait une valeur de retournée (RETURN BOOLEAN) et un paramètre sortant (p_error OUT VARCHAR2)
    D'ailleurs, mise à part une erreur, votre fonction retournera toujours vrai qu'il y ait eu ou non des lignes insérées, l'intérêt s'en trouve limité.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    Scriuiw merci également pour ta réponse.
    je ne suis malheureusement pas sûre d'avoir compris grand chose. pourrais-tu être stp plus explicite?

    Citation Envoyé par Scriuiw Voir le message
    Pourquoi utiliser un curseur alors qu'une instruction ensembliste fait l'affaire et sera bien plus efficace ?
    aurais-tu un exemple stp?


    Par ailleurs l'abus de COMMIT est à éviter, dans votre code vous en effectuez un à chaque boucle ce qui est très contre-productif.
    le COMMIT est en fin de boucle. où devrais-je le mettre sinon?

    Sinon la fonction compile ?
    oui la fonction compile.


    D'ailleurs, mise à part une erreur, votre fonction retournera toujours vrai qu'il y ait eu ou non des lignes insérées, l'intérêt s'en trouve limité.
    n'étant pas forcément un as de la programmation j'essaie justement par ce post de comprendre mon erreur.

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    Citation Envoyé par McM Voir le message
    Si tu as un DBLINK, il est parfois plus rapide de le gérer en MINUS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO COMPAGNIE_ORCL2@db2 (username, ID, compagnie)
    SELECT username, ID, compagnie
    FROM COMPAGNIE_ORCL1
    WHERE (username, ID, compagnie) IN 
      (SELECT username, ID, compagnie FROM COMPAGNIE_ORCL1  WHERE compagnie LIKE 'C%'
      MINUS
      SELECT username, ID, compagnie FROM COMPAGNIE_ORCL12@db2 WHERE compagnie LIKE 'C%'
      )
    merci MCM
    malheureusement je n'obtiens aucun résultat avec cette requête.

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Visiblement tu te positionnes sur la base 2, mon select est fait pour être utilisé sur la base 1, car c'est là où sont les données.
    Mais tu peux changer

    Ce sous select doit te ramener tous les éléments distincts, mais tu as rajouté la colonne seq. Quelle est la PK ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (SELECT username, ID, compagnie FROM COMPAGNIE_ORCL1@orcl1  WHERE compagnie LIKE 'C%'
      MINUS
      SELECT username, ID, compagnie FROM COMPAGNIE_ORCL2 WHERE compagnie LIKE 'C%'
      )
    Si la PK est username, id, compagnie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO COMPAGNIE_ORCL2 (username, ID, compagnie, seq)
    SELECT username, ID, compagnie, seq
    FROM COMPAGNIE_ORCL1@orcl1
    WHERE (username, ID, compagnie) IN 
      (SELECT username, ID, compagnie FROM COMPAGNIE_ORCL1@orcl1  WHERE compagnie LIKE 'C%'
      MINUS
      SELECT username, ID, compagnie FROM COMPAGNIE_ORCL2 WHERE compagnie LIKE 'C%'
      )
    si la pk est username,id,compagnie,seq
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO COMPAGNIE_ORCL2 (username, ID, compagnie, seq)
    SELECT username, ID, compagnie, seq
    FROM COMPAGNIE_ORCL1@orcl1
    WHERE (username, ID, compagnie,seq) IN 
      (SELECT username, ID, compagnie,seq FROM COMPAGNIE_ORCL1@orcl1  WHERE compagnie LIKE 'C%'
      MINUS
      SELECT username, ID, compagnie,seq FROM COMPAGNIE_ORCL2 WHERE compagnie LIKE 'C%'
      )

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

Discussions similaires

  1. trier une table en fonction d'une autre
    Par boss_gama dans le forum Langage SQL
    Réponses: 7
    Dernier message: 18/10/2009, 11h17
  2. Actualiser un TCD et executer une autre fonction en même temps
    Par lbar012001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 09h08
  3. Réponses: 2
    Dernier message: 13/12/2007, 15h02
  4. Réponses: 6
    Dernier message: 25/07/2007, 10h43
  5. UPDATE en fonction de la présence d'un num dans une autre table
    Par Zak Blayde dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/07/2007, 11h41

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