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 et dual ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut merge et dual ?
    Bonjour,
    peut -on utiliser la table dual dans la clause using de l'instruction merge ? comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    merge into T1
    using (select 1 as cod, 'dupond' from dual) T2
    on T1.id=1 # ou T1.id=T2.cod
    ......
    j'ai essayé ces 2 truc, ça na pas marché !!
    Merci

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    merge into emp e
      using (select 1 empno, 'TOTO' ename, 'TATA' job from dual ) s
     on (s.empno  = e.empno)
    when matched then
      update set comm = null
    when not matched then 
      insert (e.empno, e.ename, e.job) values (s.empno, s.ename, s.job)
    /

  3. #3
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    Dual est une table "comme les autres", on peux l'utiliser sans problème dans l'instruction Merge :
    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    MERGE INTO Table1 T
    USING (select '1' from dual) S   
       ON (T.COL1 = '1' and T.COL2 =2)
    WHEN MATCHED THEN 
        UPDATE SET COL3=3 
    WHEN NOT MATCHED THEN 
        INSERT INTO Table1  (COL1,COL2,COL3) values ('2',3,4)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    De ce que je vois de votre code, vous n'avez pas mis de parenthèses sur la partie ON qui effectue la jointure entre la table et le USING.
    Elles sont obligatoires.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    j'ai essayé les 2 solution ça na pas marché !!
    voilà ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO archi_table D
    USING (SELECT '001ABC' as cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL) S
    ON (S.cpd=D.cod)
    WHEN MATCHED THEN 
    UPDATE SET D.DATE_ARCHIVE = sysdate 
    WHEN NOT MATCHED THEN
    INSERT (D.cod, D.desig, D.DATE_TRAIT, D.ANO, D.DATE_EXPORT, D.DATE_ARCHIVE)
    VALUES ('001ABC', 'sad01235', '14/03/08', 'null', '14/03/08', sysdate)
    code erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Erreur commençant à la ligne 1 de la commande :
    Erreur à la ligne de commande : 3, colonne : 16
    Rapport d'erreur :
    Erreur SQL : ORA-00918: column ambiguously defined
    00918. 00000 -  "column ambiguously defined"
    *Cause:    
    *Action:

  6. #6
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO archi_table D
    USING (SELECT '001ABC' AS cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL) S
    ON (S.cpd=D.cod)
    WHEN MATCHED THEN 
    UPDATE SET D.DATE_ARCHIVE = sysdate 
    WHEN NOT MATCHED THEN
    INSERT INTO archi_table (cod, desig, DATE_TRAIT, ANO, DATE_EXPORT, DATE_ARCHIVE) 
    VALUES ('001ABC', 'sad01235', '14/03/08', 'null', '14/03/08', sysdate)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    je pense pas que le pbm est dans la clause insert !!
    j'ai déjà travaillé avec merge de cette façon en utilisant des tables dans using,
    mais là avec dual ça colle pas !

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sELECT '001ABC' AS cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL
    Il faut aliaser les variables.
    Exemple de Mnitu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    merge INTO emp e
      USING (SELECT 1 empno, 'TOTO' ename, 'TATA' job FROM dual ) s
     ON (s.empno  = e.empno)
    when matched then
      UPDATE SET comm = NULL
    when NOT matched then 
      INSERT (e.empno, e.ename, e.job) VALUES (s.empno, s.ename, s.job)

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Trois erreurs.

    La première, vous n'êtes pas rigoureux, vous aliasez dans le using :
    Mais dans votre jointure :
    La deuxième : il faut nommer toutes les colonnes de votre sous-requête, et les réutiliser dans le MERGE, le but ce n'est pas d'écrire de la constante partout mais une seule fois dans le USING.

    La dernière : vous envoyez des chaînes de caractères dans des dates, sans conversion point de salut.
    Accessoirement, voir des années écrites sur deux caractères, c'est inacceptable.

    Au final, vous auriez du écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     MERGE into archi_table d
     using (select '001ABC'                            as cod        ,
                   'sad01235'                          as desig      ,
                   to_date('14/03/2008', 'dd/mm/yyyy') as date_trait ,
                   'dsz'                               as ano        ,
                   to_date('14/03/2008', 'dd/mm/yyyy') as date_export,
                   sysdate                             as date_archive
              from dual) s
        on (s.cod = d.cod)
      WHEN MATCHED THEN
    update set d.date_archive = s.date_archive 
      WHEN NOT MATCHED THEN
    insert (d.cod, d.desig, d.date_trait, d.ano, d.date_export, d.date_archive)
    values (s.cod, s.desig, s.date_trait, s.ano, s.date_export, s.date_archive);

  10. #10
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    la variable S.cpd n'est pas défini, c'est pas S.cod ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO archi_table D
    USING (SELECT '001ABC' AS cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL) S
    ON (S.cod=D.cod)
    WHEN MATCHED THEN 
    UPDATE SET D.DATE_ARCHIVE = sysdate 
    WHEN NOT MATCHED THEN
    INSERT (D.cod, D.desig, D.DATE_TRAIT, D.ANO, D.DATE_EXPORT, D.DATE_ARCHIVE)
    VALUES ('001ABC', 'sad01235', '14/03/08', 'null', '14/03/08', sysdate)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    Bon, merci ça fonctionne,
    en effet, j'ai corriger les dates.
    mais le vrai problème c'est que la table que je veux merger est une table de jointure (elle contient des clés étrangères), j'avais oublié de remplir les autre tables où il y a les ces clés.
    Merci à tous, et au prochain poste ! ça va pas tarder !!!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    encore des problèmes !
    to_date ça marche pas avec dual !!!
    sans le to_date ça fonctionne ! mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '001ABC' as cod, 'sad01235' as des, to_date('2008/03/14','dd/mm/yyyy') as date_trait FROM DUAL
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Erreur commençant à la ligne 1 de la commande :
    SELECT '001ABC' as cod, 'sad01235' as des, to_date('2008/03/14','dd/mm/yyyy') as date_trait FROM DUAL
    Rapport d'erreur :
    Erreur SQL : ORA-01861: literal does not match format string
    01861. 00000 -  "literal does not match format string"
    *Cause:    Literals in the input must be the same length as literals in
               the format string (with the exception of leading whitespace).  If the
               "FX" modifier has been toggled on, the literal must match exactly,
               with no extra whitespace.
    *Action:   Correct the format string to match the literal.
    je me suis arraché les cheveux !!!

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    une derniere chose : je travaille en java jdbc :
    la date je la récupère d'un resultset :
    soit je fait un getString("madate") et je travaille avec un string que je le convertie en to date
    soit je récupère directement la date getDate("madate") seulement le format de la date est de : dd-mm-yyyy 00:00:00:0
    je ne sais pas comment faire ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('2008/03/14','dd/mm/yyyy')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur SQL : ORA-01861: literal does not match format string
    Besoin d'une pause café ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    c'est sûr !!
    mais je dois trouver la solution ce soir !!!

  16. #16
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    to_char(madate,'YYYY/MM/DD') => transforme une date en chaine de caractère

    to_date('2008/03/14','yyyy/mm/dd') = transforme une chaine de caractère en
    date


  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rimas2009 Voir le message
    c'est sûr !!
    mais je dois trouver la solution ce soir !!!
    ben en mettant en cohérence la date et le format !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '001ABC' AS cod, 'sad01235' AS des, to_date('14/03/2008','dd/mm/yyyy') AS date_trait FROM DUAL
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '001ABC' AS cod, 'sad01235' AS des, to_date('2008/03/14','yyyy/mm/dd') AS date_trait FROM DUAL

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par Waldar Voir le message
    vous n'êtes pas rigoureux

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Points : 62
    Points
    62
    Par défaut
    Envoyé par Waldar Voir le message
    vous n'êtes pas rigoureux
    tu veux dire quoi ?

  20. #20
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Et bien, que vous manquez de rigueur.
    Vous travaillez sur un langage, vous ne vous relisez pas.

    L'erreur de l'alias, l'erreur du format de date qui ne correspond pas à la constante que vous avez vous-même écrite, une simple lecture des messages d'erreur devrait vous mettre sur la voie, une simple relecture posée de votre code devrait vous les faire corriger.

    Rassurez-vous, comme toute chose en ce monde, ça se travaille et ça s'apprend !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Merge fichier
    Par OuBiEn dans le forum Linux
    Réponses: 2
    Dernier message: 17/02/2005, 15h44
  2. Role de Dual??
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 24/11/2004, 22h33
  3. Dual Screen sur portable
    Par aliasjcdenton dans le forum Matériel
    Réponses: 4
    Dernier message: 22/08/2004, 16h09
  4. Shell - Merge de fichiers
    Par tesla dans le forum Linux
    Réponses: 4
    Dernier message: 29/06/2004, 02h10
  5. equivalent de select nextval from dual en SQL-Server ?
    Par toze dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2003, 09h17

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