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 :

INSERT ou MERGE ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 7
    Par défaut INSERT ou MERGE ?
    Bonjour,

    Ma table posséde une colonne SOFT_SERVER_NAME et une colonne SOFT_NAME.
    Je souhaite insérer un nouvelle ligne dans la colonne SOFT_SERVER_NAME si ce serveur n'existe pas et que ce serveur n'a pas déjà l'application associée dans la colonne SOFT_NAME.

    Pour ceci, j'ai utilisé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT 
    WHEN ((SOFT_SERVER_NAME = 'SWT001') AND ((SOFT_NAME is null) OR (SOFT_NAME !='VMware)))
    THEN
      INTO WB_SOFT (SOFT_SERVER_NAME)
      VALUES ('SWT001')
      SELECT SOFT_SERVER_NAME FROM WB_SOFT;
    Ce code insère autant de lignes qu'il y a de serveur SWT001 avec un SOFT_NAME différent de "VMware". Or je souhaite qu'il insère qu'une seule ligne.

    Je sais qu'il existe la commande MERGE mais je ne parviens pas à l'appliquer.

    Pouvez-vous me venir en aide svp ?

  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
    C'est très obscur sans le contexte, notamment le select au-dessus de l'insert.

  3. #3
    Invité
    Invité(e)
    Par défaut
    le when c'est pour faire des insert dans différentes tables suivant condition, ce qui ne me semble pas être ton besoin ici.
    C'est ta requête qui doit être retravaillé pour ne sortir qu'une ligne !

    Quelque chose dans ce gout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT 
      INTO WB_SOFT (SOFT_SERVER_NAME)
      SELECT SOFT_SERVER_NAME 
    FROM WB_SOFT
    WHEN ((SOFT_SERVER_NAME = 'SWT001') AND ((SOFT_NAME IS NULL) OR (SOFT_NAME !='VMware)))
    ;
    Dernière modification par Invité ; 22/04/2010 à 19h22.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 7
    Par défaut
    Je vous explique le contexte :

    Je fais des requêtes sur des serveurs et je remonte plusieurs informations dont les applications qui sont installées dessus.
    Je peux donc avoir le même nom d'application sur plusieurs serveurs.

    Exemple de ce que donne le contenu de la table :

    Colonne 1 - Colonne 2
    SOFT_SERVER_NAME - SOFT_NAME
    SWT001 - appli1
    SWT001 - appli2
    SWT001 - appli3
    SWT002 - appli1
    SWT002 - appli4



    Lorsque j'effectue une requête, il se peut qu'une nouvelle appli soit installée sur le serveur SWT001.
    Ma fonction doit faire une vérification : si l'application appli4 n'existe pas avec le serveur SWT001 alors je fais un INSERT.
    Je ne parviens pas à écrire cette condition

    (NB : j'ai testé différentes combinaisons sans succès avec le code de Jerome_Mtl)

  5. #5
    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 y a juste un simple ordre SQL à passer.

    Voici votre jeu de test :
    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
    create table WB_SOFT
    (
       SOFT_SERVER_NAME  varchar2(6),
       SOFT_NAME         varchar2(6)
    );
     
    insert into WB_SOFT (SOFT_SERVER_NAME, SOFT_NAME)
    select 'SWT001', 'appli1' from dual union all
    select 'SWT001', 'appli2' from dual union all
    select 'SWT001', 'appli3' from dual union all
    select 'SWT002', 'appli1' from dual union all
    select 'SWT002', 'appli4' from dual;
     
    commit;
     
    select * from wb_soft;
     
    SOFT_SERVER_NAME	SOFT_NAME
    SWT001			appli1
    SWT001			appli2
    SWT001			appli3
    SWT002			appli1
    SWT002			appli4
    Voici une requête pour renseigner le complément :
    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
     
    insert into WB_SOFT (SOFT_SERVER_NAME, SOFT_NAME)
    select ssn.SOFT_SERVER_NAME, son.SOFT_NAME
    from
        (select distinct SOFT_SERVER_NAME from WB_SOFT) ssn
        cross join
        (select distinct SOFT_NAME from WB_SOFT) son
    minus
    select SOFT_SERVER_NAME, SOFT_NAME from WB_SOFT;
    -- 3 rows inserted
     
      select soft_server_name, soft_name 
        from wb_soft
    order by soft_server_name asc, soft_name asc;
     
    SOFT_SERVER_NAME	SOFT_NAME
    SWT001			appli1
    SWT001			appli2
    SWT001			appli3
    SWT001			appli4
    SWT002			appli1
    SWT002			appli2
    SWT002			appli3
    SWT002			appli4

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 7
    Par défaut
    Ce n'est pas le résultat que je souhaite, je me suis mal exprimé.

    Je complète mon exemple avec ce que j'ai et ce que je souhaite :

    Ce que j'ai avant la requête (remonté de scripts VB):
    Colonne 1 - Colonne 2
    SOFT_SERVER_NAME - SOFT_NAME
    SWT001 - appli1
    SWT001 - appli2
    SWT001 - appli3
    SWT002 - appli1
    SWT002 - appli4

    Ce que me remonte ma requête :
    SWT001 : appli1, appli2, appli3, appli4
    SWT002 : appli1, appli4

    Ce que je souhaite obtenir :
    Colonne 1 - Colonne 2
    SOFT_SERVER_NAME - SOFT_NAME
    SWT001 - appli1
    SWT001 - appli2
    SWT001 - appli3
    SWT001 - appli4
    SWT002 - appli1
    SWT002 - appli4

    Le but est donc d'insérer une nouvelle ligne avec le serveur SWT001 contenant l'appli4.
    Ici, le serveur SWT002 contient une appli qui a le même nom que la nouvelle appli installée sur le serveur SWT001.
    Je ne parviens pas à établir cette condition.

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

Discussions similaires

  1. Probleme insert avec merge
    Par flokent7 dans le forum Oracle
    Réponses: 4
    Dernier message: 20/07/2012, 10h51
  2. Réponses: 5
    Dernier message: 13/12/2010, 14h25
  3. Réponses: 2
    Dernier message: 22/07/2010, 12h12
  4. passer du insert/update à MERGE
    Par zaineb.z dans le forum SQL
    Réponses: 18
    Dernier message: 05/03/2008, 15h36
  5. [Merge] Pas d'insertion
    Par VinceTlse dans le forum Oracle
    Réponses: 7
    Dernier message: 27/02/2007, 15h49

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