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 :

[10g] Optimiser une requête


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut Optimiser une requête - Oracle10g
    J'ai créé un infocentre que je charge à partir de données provenant d'une autre base (isiparc).
    Le script est fait de manière à mettre à jour toutes les données déjà chargées et d'insérer les données nouvelles.
    Il fonctionne mais le temps de chargement n'est pas terrible.

    Voici ma trame de code :

    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
    UPDATE  tblcible
    SET     col1 = (select col1 from tblsource@isiparc where id = tblsource.id )
        ,   coln = (select coln from tblsource@isiparc where id = tblsource.id )
    ;
    INSERT INTO tblcible
        (   id
        ,   col1
        ,   coln
        )
    SELECT  src.id
        ,   src.col1
        ,   src.coln
    FROM    tblsource@isiparc   AS src
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    tblcible    AS cbl
                WHERE   cbl.id = src.id 
            )
    ;
    Voilà, c'est surtout le update qui rend le temps de chargement long à mon avis, avez-vous des solutions à me proposer pour améliorer la rapidité d'exécution?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Sans garantie, il me semble avoir déja fait un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE  tblcible
    SET     (col1,coln) = (SELECT col1,coln FROM tblsource@isiparc WHERE id = tblsource.id )
    
    ;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,
    Est ce que tu as un trigger after ou before update sur ta table ?

    Peut être l'index qui pose problème ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos pistes,

    Garuda, ta méthode fonctionne et m'a permis de simplifier la syntaxe

    Ensuite j'ai essayé de regarder le merge, j'ai pris exemple sur le cours du site : http://oracle.developpez.com/faq/?page=3-1#merge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO utilisateur T1
    	USING (SELECT U.C_UTIL,decode(U.N_UTIL,NULL,'(VIDE)',U.N_UTIL),decode(U.N_UTIL,NULL,'(VIDE)',U.N_UTIL),F.L_FONCTION FROM utilisateur@isiparc U,fonction@isiparc F WHERE U.C_FONCTION=F.C_FONCTION(+)) T2
    		ON (T1.id_util = T2.C_UTIL)
    WHEN MATCHED THEN
    	UPDATE SET (T1.nom_util,T1.prenom_util,T1.libelle_fonction) = (decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),T2.L_FONCTION)
    WHEN NOT MATCHED THEN
    	INSERT (T1.id_util,T1.nom_util,T1.prenom_util,T1.libelle_fonction) VALUES (T2.C_UTIL,decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),T2.L_FONCTION)
    ;
    Hors j'ai une erreur :
    ORA-01747: invalid user.table.column, table.column, or column specification

    Je n'arrive pas à résoudre cette erreur, pouvez-vous m'aider?

    PS : j'ai vu que le tutoriel était pour oracle 9i, serait-ce ça?

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MERGE INTO tblcible c
    using tblsource@isiparc s
    on (c.id=s.id)
    when matched then
    update SET col1 = s.col1,
     coln=s.coln
    where 
      c.col1 != s.col1 or (c.col1 is null and s.col1 is not null) or (c.col1 is not null and s.col1 is null)
      or
      c.coln != s.coln or (c.coln is null and s.coln is not null) or (c.coln is not null and s.coln is null)
    when not matched then
    INSERT (id,col1,coln) values (s.id,s.col1,s.coln)

    note la where clause, c'est du tuning!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    J'ai un problème dans ma requête, j'ai toujours la même erreur invalid....

    Pouvez vous me dire où je me suis trompé svp ?

    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
    MERGE INTO service c
    	USING imp_service_annuaire@isiparc s
    		ON (c.id_service = s.C_SERVICE_ORI)
    WHEN MATCHED THEN
    	UPDATE SET  (c.nom_service_niv1 = s.N_SERVICE_1
    		   ,c.nom_service_niv2 = s.N_SERVICE_2
    		   ,c.nom_service_niv3 = s.N_SERVICE_3
                       ,c.nom_service_niv4 = s.N_SERVICE_4
    		   ,c.nom_service_niv5 = s.N_SERVICE_5
    		   ,c.administratif_medical = decode(s.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL')
                       )
    	WHERE c.nom_service_niv1 != s.N_SERVICE_1 or (c.nom_service_niv1 is null and s.N_SERVICE_1 is not null) or (c.nom_service_niv1 is not null and s.N_SERVICE_1 is null)
    	   or c.nom_service_niv2 != s.N_SERVICE_2 or (c.nom_service_niv2 is null and s.N_SERVICE_2 is not null) or (c.nom_service_niv2 is not null and s.N_SERVICE_2 is null)
    	   or c.nom_service_niv3 != s.N_SERVICE_3 or (c.nom_service_niv3 is null and s.N_SERVICE_3 is not null) or (c.nom_service_niv3 is not null and s.N_SERVICE_3 is null)
    	   or c.nom_service_niv4 != s.N_SERVICE_4 or (c.nom_service_niv4 is null and s.N_SERVICE_4 is not null) or (c.nom_service_niv4 is not null and s.N_SERVICE_4 is null)
    	   or c.nom_service_niv5 != s.N_SERVICE_5 or (c.nom_service_niv5 is null and s.N_SERVICE_5 is not null) or (c.nom_service_niv5 is not null and s.N_SERVICE_5 is null)
    	   or c.administratif_medical != decode(s.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL')
    WHEN NOT MATCHED THEN
    	INSERT (c.id_service,c.nom_service_niv1,c.nom_service_niv2,c.nom_service_niv3,c.nom_service_niv4,c.nom_service_niv5,c.administratif_medical) VALUES (s.C_SERVICE_ORI,s.N_SERVICE_1,s.N_SERVICE_2,s.N_SERVICE_3,s.N_SERVICE_4,s.N_SERVICE_5,decode(s.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL'))
    ;

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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
     
    MERGE INTO service T1
        USING imp_service_annuaire@isiparc T2
            ON (T1.id_service = T2.C_SERVICE_ORI)
    WHEN MATCHED THEN
        UPDATE SET 
                T1.nom_service_niv1 = T2.N_SERVICE_1
               ,T1.nom_service_niv2 = T2.N_SERVICE_2
               ,T1.nom_service_niv3 = T2.N_SERVICE_3
                       ,T1.nom_service_niv4 = T2.N_SERVICE_4
               ,T1.nom_service_niv5 = T2.N_SERVICE_5
               ,T1.administratif_medical = decode(T2.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL')
        WHERE T1.nom_service_niv1 != T2.N_SERVICE_1 or (T1.nom_service_niv1 is null and T2.N_SERVICE_1 is not null) or (T1.nom_service_niv1 is not null and T2.N_SERVICE_1 is null)
           or T1.nom_service_niv2 != T2.N_SERVICE_2 or (T1.nom_service_niv2 is null and T2.N_SERVICE_2 is not null) or (T1.nom_service_niv2 is not null and T2.N_SERVICE_2 is null)
           or T1.nom_service_niv3 != T2.N_SERVICE_3 or (T1.nom_service_niv3 is null and T2.N_SERVICE_3 is not null) or (T1.nom_service_niv3 is not null and T2.N_SERVICE_3 is null)
           or T1.nom_service_niv4 != T2.N_SERVICE_4 or (T1.nom_service_niv4 is null and T2.N_SERVICE_4 is not null) or (T1.nom_service_niv4 is not null and T2.N_SERVICE_4 is null)
           or T1.nom_service_niv5 != T2.N_SERVICE_5 or (T1.nom_service_niv5 is null and T2.N_SERVICE_5 is not null) or (T1.nom_service_niv5 is not null and T2.N_SERVICE_5 is null)
           or T1.administratif_medical != decode(T2.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL')
    WHEN NOT MATCHED THEN
        INSERT (T1.id_service,T1.nom_service_niv1,T1.nom_service_niv2,T1.nom_service_niv3,T1.nom_service_niv4,T1.nom_service_niv5,T1.administratif_medical) VALUES (T2.C_SERVICE_ORI,T2.N_SERVICE_1,T2.N_SERVICE_2,T2.N_SERVICE_3,T2.N_SERVICE_4,T2.N_SERVICE_5,decode(T2.N_SERVICE_1,'D.A.F','ADMINISTRATIF','D.G.','ADMINISTRATIF','D.M.T.','ADMINISTRATIF','D.P.E.I.M.P.','ADMINISTRATIF','D.P.H.L.','ADMINISTRATIF','D.R.H.F.C.','ADMINISTRATIF','D.S.I.H.','ADMINISTRATIF','DIRECTION QUALITE','ADMINISTRATIF','UF-FERMEES','UF-FERMEES','MEDICAL'))
    ;

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Merci, ceci fonctionne parfaitement en retirant les parenthèses, mais comment faire lorsque je veux charger une table de mon infocentre à partir de plusieurs tables venant d'isiparc : où dois je mettre les noms des tables et les jointures correspondantes ?

    par exemple si je charge à partir de tblsource1@isiparc et tblsource2@isiparc avec tblsouce1 et tblsource2 reliées

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    using (subquery)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    J'ai essayé de cette manière mais j'ai toujours une erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MERGE INTO utilisateur c
    	USING utilisateur@isiparc s, fonction@isiparc f
    		ON (c.id_util = s.C_UTIL and s.C_FONCTION=f.C_FONCTION(+))
    WHEN MATCHED THEN
    	UPDATE SET c.nom_util = decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL)
    		  ,c.prenom_util = decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL)
    		  ,c.libelle_fonction = s.L_FONCTION
    	WHERE   c.nom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.nom_util is null)
    		c.prenom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.prenom_util is null)
    		c.libelle_fonction != s.L_FONCTION or (c.libelle_fonction is null and s.L_FONCTION is not null)
    WHEN NOT MATCHED THEN
    	INSERT (c.id_util,c.nom_util,c.prenom_util,c.libelle_fonction) VALUES (s.C_UTIL,decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),s.L_FONCTION)
    ;
    Pourriez vous m'indiquer la bonne syntaxe à adopter pour cet exemple?, ainsi, par analogie, je pourrais l'appliquer pour toutes mes autres tables à charger.

    Merci pour votre aide en tout cas, car j'avance énormément grâce à vous

  12. #12
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Quelle erreur ? à quel endroit (mettre la ligne en rouge dans ton code !)
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MERGE INTO utilisateur c
    	USING utilisateur@isiparc s, fonction@isiparc f
    		ON (c.id_util = s.C_UTIL and s.C_FONCTION=f.C_FONCTION(+))
    WHEN MATCHED THEN
    	UPDATE SET c.nom_util = decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL)
    		  ,c.prenom_util = decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL)
    		  ,c.libelle_fonction = s.L_FONCTION
    	WHERE   c.nom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.nom_util is null)
    		c.prenom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.prenom_util is null)
    		c.libelle_fonction != s.L_FONCTION or (c.libelle_fonction is null and s.L_FONCTION is not null)
    WHEN NOT MATCHED THEN
    	INSERT (c.id_util,c.nom_util,c.prenom_util,c.libelle_fonction) VALUES (s.C_UTIL,decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),s.L_FONCTION)
    ;
    C'est la virgule qui n'aime pas je crois (erreur ORA-00905 : missing keyword)

  14. #14
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Armand59
    USING utilisateur@isiparc s, fonction@isiparc f
    non, pas comme ça, il faut using (subquery)

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using (select bla,bli,blo from utilisateur@isiparc s, fonction@isiparc f where f.id=s.id)

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Ah d'accord, merci, je n'avais pas compris , j'ai rectifié comme vous avez dis mais j'ai maintenant une erreur à la fin de mon code au niveau du insert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MERGE INTO utilisateur c
    	USING (SELECT decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),f.L_FONCTION FROM utilisateur@isiparc s, fonction@isiparc f WHERE s.C_FONCTION=f.C_FONCTION(+))
    		ON (c.id_util = (SELECT s.C_UTIL FROM utilisateur@isiparc s))
    WHEN MATCHED THEN
    	UPDATE SET c.nom_util = (SELECT decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) FROM utilisateur@isiparc s WHERE s.C_FONCTION=f.C_FONCTION(+))
    		  ,c.prenom_util = (SELECT decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) FROM utilisateur@isiparc s WHERE s.C_FONCTION=f.C_FONCTION(+))
    		  ,c.libelle_fonction = (SELECT f.L_FONCTION FROM utilisateur@isiparc s, fonction@isiparc f WHERE s.C_FONCTION=f.C_FONCTION(+))
    	WHERE   c.nom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.nom_util is null)
    		or c.prenom_util != decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) or (c.prenom_util is null)
    		or c.libelle_fonction != s.L_FONCTION or (c.libelle_fonction is null and s.L_FONCTION is not null)
    WHEN NOT MATCHED THEN
    	INSERT (c.id_util,c.nom_util,c.prenom_util,c.libelle_fonction) VALUES (SELECT s.C_UTIL,decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL),f.L_FONCTION FROM utilisateur@isiparc s, fonction@isiparc f WHERE s.C_FONCTION=f.C_FONCTION(+))
    ;
    L'erreur : ORA_00936: missing expression

    J'ai compté le nombre de champ de part et d'autre, mais je ne crois pas qu'il y en manque.

    Qu'en pensez vous?

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu dois donner un alias à tes champs


    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
    MERGE INTO utilisateur c
     USING (
          SELECT 
            decode(s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) COL1,
            decode  (s.N_UTIL,NULL,'(VIDE)',s.N_UTIL) COL2,
            f.L_FONCTION COL3
          FROM utilisateur@isiparc s, fonction@isiparc f 
          WHERE s.C_FONCTION=f.C_FONCTION(+)
      ) T
    ON (c.id_util = t.COL1)
    WHEN MATCHED THEN
    	UPDATE SET c.nom_util = t.COL1
    		  ,c.prenom_util = t.COL2
    		  ,c.libelle_fonction = t.COL3
    	WHERE   c.nom_util != t.COL1 or t.COL1 is null
    		or c.prenom_util != t.COL2 or t.COL2 is null
    		or c.libelle_fonction != t.COL3 or t.COL3 is null
    WHEN NOT MATCHED THEN
    INSERT (id_util,nom_util,prenom_util,libelle_fonction) 
    VALUES (t.COL1,t.COL1,t.COL2,t.COL3)
    ;

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    j'espère que tu vas t'en sortir, ce n'est que pour te montrer la syntaxe, il faut que tu donnes le bon alias aux bonnes colonnes bien sûr

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Merci, ça fonctionne nickel , une petite question encore, admettons que je charge pour la première fois mes tables, là il me retourne un message :

    ex : 716 lignes fusionnées pour la table utilisateur

    Par contre si j'exécute à nouveau mon script de chargement, il m'affiche :

    ex : 0 lignes fusionnées

    A première vue, le nombre de lignes affiché correspond seulement au nombre de lignes créées, donc on ne sait pas s'il a bien fait le update

    je pensais qu'il m'aurait affiché 716 pour 716 lignes mises à jour

    Ai-je raison ou alors il y a erreur dans mon script et il devrait bien m'afficher 716 lignes ?

  19. #19
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ça c'est grace à mon tuning perso!

    en fait si tu enlèves la clause where, tu verras qu'il met à jour toutes les lignes.

    c'est comme si tu compares
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update t set x=1 where x!=1 or x is null
    dans le premier cas tu update toutes les lignes, dans le 2e cas, tu économises l'update lorsque x=1 !

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Il est trop fort ton tunning , il me fait gagner un temps fou dans le chargement.

    Bon j'arrive presqu'au bout, j'ai une table où il y a toujours une ligne fusionnée, même quand je viens de la charger juste avant (et quand je regarde le nombre de ligne dans la table il ne change pas, ça doit être au niveau du update alors).

    Je mets le code mais ne te prends pas trop la tête car elle est assez compliquée, donc si tu n'arrives pas à trouver l'erreur, laisse tomber, tu m'as déjà suffisamment aidé comme ça

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    MERGE INTO intervention c
    	USING (
    		SELECT DISTINCT
    		s.C_INTER col1,
    		s.C_OBJET col2,
    		s.C_UTIL_DEM col3,
    		decode(s.C_SOCIETE,NULL,'(VIDE)',s.C_SOCIETE) col4,
    		decode(s.DE_DEMINTER,NULL,'(VIDE)',s.DE_DEMINTER) col5,
    		decode(s.DE_RESOINTER,NULL,'(VIDE)',s.DE_RESOINTER) col6,
    		s.D_DEMINTER col7,
    		s.D_PCHARGE col8,
    		s.MTU_INTER col9,
    		SI.N_SITE_1 col10,
    		SI.N_SITE_2 col11,
    		SI.N_SITE_3 col12,
    		decode(SE.N_SERVICE_1,NULL,'(VIDE)',SE.N_SERVICE_1) col13,
    		decode(SE.N_SERVICE_2,NULL,'(VIDE)',SE.N_SERVICE_2) col14,
    		decode(s.L_INTER,NULL,'(VIDE)',s.L_INTER) col15
    		FROM intervention@isiparc s,qry_histmvtobj@isiparc HD,qry_histmvtobj@isiparc HF,imp_service_annuaire@isiparc SE,imp_site_annuaire@isiparc SI,objet@isiparc O 
    		WHERE   s.C_OBJET=HD.C_OBJET(+)
    		AND s.C_OBJET=O.C_OBJET(+)
    		AND decode(HD.C_SERVICE_NEW,NULL,O.C_SERVICE,HD.C_SERVICE_NEW)=SE.C_SERVICE_ORI
    		AND decode(HD.C_SITE_NEW,NULL,O.C_SITE,HD.C_SITE_NEW)=SI.C_SITE_ORI
    		AND HD.C_HISTMVT_NEW=HF.C_HISTMVTOBJ(+)
    		AND s.D_DEMINTER >= HD.D_HIST
    		AND s.D_DEMINTER <= decode(HF.D_HIST,NULL,CURRENT_DATE,HF.D_HIST)
    		) t
    	ON (c.id_inter = t.col1)
    WHEN MATCHED THEN
    	UPDATE SET c.id_obj = t.col2 
     		,   c.id_util = t.col3
        		,   c.nom_prestataire = t.col4
        		,   c.libelle_panne = t.col5
        		,   c.libelle_inter = t.col6
        		,   c.date_panne = t.col7
        		,   c.date_inter = t.col8
        		,   c.montant_inter = t.col9
        		,   c.nom_site_inter_niv1 = t.col10
        		,   c.nom_site_inter_niv2 = t.col11
        		,   c.nom_site_inter_niv3 = t.col12
        		,   c.nom_service_inter_niv1 = t.col13
        		,   c.nom_service_inter_niv2 = t.col14
        		,   c.type_panne = t.col15
    	WHERE 	    c.id_obj != t.col2 or (c.id_obj is null and t.col2 is not null) or (c.id_obj is not null and t.col2 is null)
     		or  c.id_util != t.col3 or (c.id_util is null and t.col3 is not null) or (c.id_util is not null and t.col3 is null)
        		or  c.nom_prestataire != t.col4 or (c.nom_prestataire is null and t.col4 is not null) or (c.nom_prestataire is not null and t.col4 is null)
        		or  c.libelle_panne != t.col5 or (c.libelle_panne is null and t.col5 is not null) or (c.libelle_panne is not null and t.col5 is null)
        		or  c.libelle_inter != t.col6 or (c.libelle_inter is null and t.col6 is not null) or (c.libelle_inter is not null and t.col6 is null)
        		or  c.date_panne != t.col7 or (c.date_panne is null and t.col7 is not null) or (c.date_panne is not null and t.col7 is null)
        		or  c.date_inter != t.col8 or (c.date_inter is null and t.col8 is not null) or (c.date_inter is not null and t.col8 is null)
        		or  c.montant_inter != t.col9 or (c.montant_inter is null and t.col9 is not null) or (c.montant_inter is not null and t.col9 is null)
        		or  c.nom_site_inter_niv1 != t.col10 or (c.nom_site_inter_niv1 is null and t.col10 is not null) or (c.nom_site_inter_niv1 is not null and t.col10 is null)
        		or  c.nom_site_inter_niv2 != t.col11 or (c.nom_site_inter_niv2 is null and t.col11 is not null) or (c.nom_site_inter_niv2 is not null and t.col11 is null)
        		or  c.nom_site_inter_niv3 != t.col12 or (c.nom_site_inter_niv3 is null and t.col12 is not null) or (c.nom_site_inter_niv3 is not null and t.col12 is null)
        		or  c.nom_service_inter_niv1 != t.col13 or (c.nom_service_inter_niv1 is null and t.col13 is not null) or (c.nom_service_inter_niv1 is not null and t.col13 is null)
        		or  c.nom_service_inter_niv2 != t.col14 or (c.nom_service_inter_niv2 is null and t.col14 is not null) or (c.nom_service_inter_niv2 is not null and t.col14 is null)
        		or  c.type_panne != t.col15 or (c.type_panne is null and t.col15 is not null) or (c.type_panne is not null and t.col15 is null)
    WHEN NOT MATCHED THEN
    	INSERT (c.id_inter,c.id_obj,c.id_util,c.nom_prestataire,c.libelle_panne,c.libelle_inter,c.date_panne,c.date_inter,c.montant_inter,c.nom_site_inter_niv1,c.nom_site_inter_niv2,c.nom_site_inter_niv3,c.nom_service_inter_niv1,c.nom_service_inter_niv2,c.type_panne)
    	VALUES (t.col1,t.col2,t.col3,t.col4,t.col5,t.col6,t.col7,t.col8,t.col9,t.col10,t.col11,t.col12,t.col13,t.col14,t.col15)
    ;
    Merci pour tout

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

Discussions similaires

  1. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 18h47
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  3. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 11h31
  4. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

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