Optimisation de requete PL/SQL

Optimisation de requete PL/SQL - SQL/NoSQL - Programmation

Marsh Posté le 14-11-2005 à 10:51:47    

Je cherche à faire une requete du type mais je ne vois pas trop comment m'y prendre
 

Code :
  1. DECLARE
  2.    valeurcount INTEGER;
  3.  
  4. BEGIN
  5.   -- copie des données de la table tmp_chantier  vers la table cd
  6.    FOR r IN (
  7.      select ctc.id_ctc,
  8.     c.ct_code,
  9.     c.mo_code,
  10.             c.ct_libelle,
  11.             c.ct_type_local
  12.      from tmp_chantier c, ctc, chantier_directeur cd
  13.      where c.ct_type_local = 'D'
  14.        --and c.et_code = ctc.code_ctc
  15.        --and c.ct_code = cd.code_cd
  16.    )
  17.    LOOP
  18.  
  19.      select count (*) into valeurcount sur les données de la requete si dessus  where
  20.          c.et_code = ctc.code_ctc (1)
  21.      and c.ct_code = cd.code_cd (2);
  22.    
  23.  
  24.      IF valeurcount == 0 THEN
  25.         nouveau test sur les valeur repectant les conditions (1) et (2) avant insert
  26.      ELSE
  27.       insert into ... pour les valeurs ne respectant pas les conditions (1) et (2)
  28.      END IF;
  29.    
  30.    
  31.    
  32. END LOOP;
  33. COMMIT;
  34.      
  35. END;
  36. /

Reply

Marsh Posté le 14-11-2005 à 10:51:47   

Reply

Marsh Posté le 14-11-2005 à 13:59:41    

Quelle est la question ?

Reply

Marsh Posté le 14-11-2005 à 14:30:32    

je cherche comment faire pour optimiser mon script..éviter de faire de trop de requete et passer sans if

Reply

Marsh Posté le 14-11-2005 à 14:34:40    

Beegee a écrit :

Quelle est la question ?


 
En fait j'ai réussi à avancer mais il me reste un problème  
 

Code :
  1. FOR r IN (
  2.      select c.ct_code,
  3.     c.mo_code,
  4.             c.ct_libelle,
  5.             c.ct_type_local
  6.      from tmp_chantier c
  7.      where c.ct_type_local = 'D' -- regle IMP-N1
  8.        and (   
  9.             ( c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
  10.               and c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
  11.             ) -- regle IMP-N2
  12.             or 
  13.             ( c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
  14.               and c.uo_code = -1
  15.             ) -- regle IMP-N1
  16.             or 
  17.             ( c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
  18.               and c.uo_code = -1
  19.             ) -- regle IMP-N1
  20.            )
  21.    )
  22.    LOOP
  23.  
  24.  
  25.    
  26.     insert into chantier_directeur (id_chantier_directeur,
  27.                                     id_ctc,
  28.                                     code_cd,
  29.                                     code_mod_cd,
  30.                                     libelle_cd,
  31.                                     flag_import)
  32.    values(chantier_directeur_seq.nextval,
  33.          r.id_ctc,
  34.           r.ct_code,
  35.           r.mo_code,
  36.           r.ct_libelle,
  37.           1);
  38.    END LOOP;


 
Comment faire dans mon insert pour récupérer mon id_ctc??

Reply

Marsh Posté le 14-11-2005 à 18:05:45    

Beurk, du PL/SQL pour qqch qui peut s'écrire en SQL directement ... ou comment ralentir un process inutilement !
 

Code :
  1. INSERT INTO chantier_directeur
  2. (id_chantier_directeur, 
  3. id_ctc, 
  4. code_cd, 
  5. code_mod_cd, 
  6. libelle_cd,
  7. flag_import)
  8. SELECT chantier_directeur_seq.nextval,
  9.        ???, -- à toi de savoir d'où vient le champ id_ctc !!!
  10.        c.ct_code,
  11.        c.mo_code,
  12.        c.ct_libelle,
  13.        c.ct_type_local 
  14. FROM tmp_chantier c
  15. WHERE c.ct_type_local = 'D' -- regle IMP-N1
  16. AND ((c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
  17.       AND c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)) -- regle IMP-N2
  18.      OR (c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
  19.          AND c.uo_code = -1) -- regle IMP-N1
  20.      OR (c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
  21.          AND c.uo_code = -1) -- regle IMP-N1
  22. );


Message édité par Beegee le 14-11-2005 à 18:06:53
Reply

Marsh Posté le 16-11-2005 à 09:13:58    

EN fait je suis passé par du PL SQL car j'ai d'autre controles à faire avant mon insert

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed