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

Langage SQL Discussion :

syntaxe et optimisation de codes


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut syntaxe et optimisation de codes
    Bonjour
    j'ai 2 petits problemes à vous soumettre

    Tout d'abord, un probleme de syntaxe
    oracle n'aime pas les guillemets et les apostrophes imbriqués dans la ligne CB.name = "C'est moi"


    D'autre part, apres avoir parcouru les tutoriels et autres cours, j'ai bien l'impression que les jointures dans mon codes ne sont pas top.
    Serait-il possible de l'optimiser un peu ?

    voici l'architecture des 2 tables concernées.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update  cv_carteblanche CB
    set CB.name = 'Eli',  CB.broker = 'today', CB.contract = '2'
    where CB.idxaccount IN
    	  ( select idxaccount
    	    from cv_account A
    	    where A.MARKET = '4' 
    	  	and A.OWNERNAME = 'GLEUREXTES' 
    		and A.name = 'CPT5EUREX'
    		and CB.broker = 'UTI2'
    		and CB.contract = '%'
    		and CB.name = "C'est moi"
    	  )
    ;
    Enfin, quel serait le code pour savoir si :
    _ le triplet {c1, c2, c3} de la table t1 est unique ?
    _ le couple {c1, c2} existe dans la table t1 ?
    Ces 2 requetes seraient des verifications avant de faire l'insertion.
    Certainement, je les insererai dans des fonctions ou procédures.

    merci infiniement

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 64
    Points : 77
    Points
    77
    Par défaut Re: syntaxe et optimisation de codes
    Citation Envoyé par elitol
    oracle n'aime pas les guillemets et les apostrophes imbriqués dans la ligne CB.name = "C'est moi"
    Pour ca il existe des fonctions par exemple addslashes() en php mais surement dans les autres languages aussi.

  3. #3
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    pour l'histoire des quotes et apostrophes :
    il faut doubler les apostrophes dans une chaine
    et pour delimiter une chaine de caracteres il faut la mettre entre apostrophe
    comme ceci
    ='C''est moi'

  4. #4
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    une syntaxe plus cohérente est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update  cv_carteblanche CB 
    set CB.name = 'Eli',  
         CB.broker = 'today',
         CB.contract = '2' 
    where  CB.broker = 'UTI2' 
    and CB.contract = '%' 
    and CB.name = 'C''est moi' 
    and CB.idxaccount IN ( select idxaccount 
                                      from cv_account A 
                                      where A.MARKET = '4' 
                                      and     A.OWNERNAME = 'GLEUREXTES' 
                                      and A.name = 'CPT5EUREX' 
                                    )
    A+

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    tout d'abord merci pour vos remarques

    d'autre part, j'aimerais créer une fonction qui me renvoie un booléen selon que le SELECT renvoie une ligne ou pas

    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
     
    CREATE OR REPLACE FUNCTION VerifXGM (xgm_mkt cv_xgm.market%type, xgm_name cv_xgm.market%type) return integer
    IS
     
    ma cv_xgm.market%type ;
    na cv_xgm.market%type ;
    verifxgm_ boolean ; 
     
    BEGIN
      		SELECT market, name INTO ma, na
    		FROM cv_xgm
    		WHERE market = xgm_mkt AND name = xgm_name ;
    		IF sql%notfound 
    			THEN VerifXGM_ := false ;
    			ELSE VerifXGM_ := true ;
    			END IF ; 
    		RETURN (VerifXGM_) ;
    END;
    ma fonction ne compile pas car il faut une expression calculant la valeur de retour dans le RETURN.

    Quelqu'un a t-il la solution ?

  6. #6
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    ta fonction doit retourner un BOOLEAN et non un INTEGER !!!

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    merci pour ta reponse
    c'etait une etourderie de ma part

    au debut je pensais mettre 1 et 0 pour true et false et j'ai pas rectifier les types.

    Peux tu me dire si ma fonction est une bonne facon de verifier si le couple {c1, c2} existe dans la table t1 ?

    De la meme facon, quel serait le code pour savoir si le triplet {c1, c2, c3} de la table t1 est unique ?
    Ces 2 requetes seraient des verifications avant de faire une insertion.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    Dans ce cas l'utilisation d'un prédicat comme UNIQUE serait le plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT 1
    FROM   MA_TABLE
    WHERE  UNIQUE (SELECT *
                   FROM MA_TABLE
                   WHERE COL1 = 'C1'
                     AND COL2 = 'C2'               
                     AND COL3 = 'C3')
    Mais je ne sais pas si ton SGBDR le supporte...

    A lire :
    http://sqlpro.developpez.com/SQL_AZ_...RY_VIDE_UNIQUE

    A +

  9. #9
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Si la solution précédente n'est pas supportée tu peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT  count(*)
     FROM MA_TABLE 
     WHERE COL1 = 'C1' 
     AND COL2 = 'C2'                
     AND COL3 = 'C3'
    having count(*)=1
    A+

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    merci

    je suis sur oracle 9i
    j'ai testé le code
    UNIQUE ne passe pas tel quel.

    en fait, je veux faire une insertion si les données n'existent pas deja.
    j'ai 2 tests à faire
    ma procedure compile.
    elle marche quand le SELECT INTO renvoie un tuple mais pas quand il ne retourne rien.

    j'utilise pourtant le curseur SQL%NOTFOUND juste apres ma requete.

    Utiliser l'exception NO_DATA_FOUND ne resoudrait pas mon probleme car l'exception peut etre soulevée à 2 reprises pendant l'execution et selon le cas, ce n'est pas le meme code qui est executé.

    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
     
    select IDXACCOUNT into get_idxaccount
    from cv_account a
    where ... ;
         if sql%notfound
         then dbms_output.put_line('can''t insert : account doesn''t exist') ;
         else 
    	select broker INTO ligne
    	from cv_carte cb
    	where ... ;	
    	if sql%notfound
                    then insert into cv_carte values (get_idxaccount, cb_name, cb_broker, cb_contract ) ;
    	DBMS_OUTPUT.put_line('carte inserted)') ;
                    else
    	DBMS_OUTPUT.put_line('carte not inserted because it already exists') ;
                    end if ;
    end if ;

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    si je n'y arrive pas avec cette methode, je crois que je serai contrainte d'imbriquer les 2 select

    ca ne me plait pas trop ; d'autant moins que je ne pourrai pas cibler à cause de quel SELECT l'insertion ne se fait pas.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    quelqu'un peut-il m'aider ?

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    j'ai eu la reponse sur un autre forum

    merci à LKBrwn_DBA

    NO_DATA FOUND Can sure solve the problem:
    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
     
    Begin
      Select IDXACCOUNT Into Get_Idxaccount 
        From Cv_Account A 
       Where ... ; 
      Begin 
        Select BROKER Into Ligne 
          From Cv_Carte Cb 
         Where ... ;    
        Dbms_Output.Put_Line('Carte Not Inserted Because It Already Exists'); 
      Exception
        When No_Data_Found Then
          Insert Into Cv_Carte Values (Get_Idxaccount, Cb_Name, Cb_Broker, Cb_Contract ); 
          Dbms_Output.Put_Line('Carte Inserted)'); 
      End;              
    Exception
      When No_Data_Found Then
        Dbms_Output.Put_Line('Can''t Insert : Account Doesn''t Exist') ; 
    End;

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    A noter sous Oracle une syntaxe bien plus fine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Insert Into Cv_Carte 
    SELECT Get_Idxaccount, Cb_Name, Cb_Broker, Cb_Contract  
    WHERE NOT EXISTS ( Select BROKER 
                                     From Cv_Carte Cb 
                                    Where ... );

    Merci de poster les questions relatives à un SGBD particulier dans le forum ad hoc à l'avenir (ici Oracle)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    tu as raison, je ferai attention la prochaine fois de poster sur le bon forum.

    Une derniere question :
    avec ta requete, comment geres-tu les messages d'erreur ?

  16. #16
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    la variable SQL%ROWCOUNT retourne le nombre de lignes traitées par la commande précédente, tu peux t'en servir en testant si il y a eu 0, 1 ou plus d'une ligne insérée

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    ca me parait tres bien pour savoir si la carte existe ou pas.
    mais pour le compte ?

    je m'explique :

    1 carte peut ne pas etre inserée pour 2 raisons :
    - soit le compte n'existe pas
    - soit la carte existe deja pour ce meme compte

    il me semble qu'avec SQL%ROWCOUNT je ne peux traiter que la 2eme possibilité :

  18. #18
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Effectivement, le code que j'ai donné ne remplace que la partie SELECT + INSERT (2° corps de programme) en y ajoutant le test sur ROWCOUNT... ceci dit la 1° partie reste obligatoire sauf que je remplacerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Select IDXACCOUNT Into Get_Idxaccount 
        From Cv_Account A 
       Where ... ;
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 1 FROM DUAL 
    WHERE EXISTS (Select IDXACCOUNT Into Get_Idxaccount 
        From Cv_Account A 
       Where ... );
    l'avantage du EXISTS c'est qu'Oracle s'arrête dés qu'une ligne est trouvée

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Orafrance,

    je manque de temps et de surtout de connaissances en PL/SQL pour comprendre comment utiliser ton code. (ma date butoire est ce soir 19h)

    je vais rester avec celui que j'ai deja et que je maitrise, mais qui est certainement moins performant et moins lisible que celui que tu me proposes.

    neanmoins je te remercie pour tous tes conseils alors meme que je considerais mon sujet comme etant [résolu].

    rendez-vous une prochaine fois sur le forum Oracle

    Elitol

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

Discussions similaires

  1. [Perf] Comment optimiser son code ?
    Par Frifron dans le forum Général Java
    Réponses: 12
    Dernier message: 11/08/2005, 09h05
  2. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  3. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  4. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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