MaRTy59  | Bonjour à tous, je dois mettre à jour le code interne d'une personne, ce code renvoie à un service travaillé.
 Par exemple une personne X a comme code interne 1199
 1199 renvoie au service Secrétariat par exemple.
   Dans mon Pl/Sql j'utilise cette requête pour identifier toutes les personnes que je dois mettre à jour :  
  Code :
 SELECT civ.codcol, civ.entorg, p_ctc.ctcexcde, p_ctc.dpmtincde, r_dpmt.dpmtexcde, r_dpmt.dpmtincde FROM p_ctc, p_cpyaddr, jpb_pers civ, r_dpmt WHERE p_ctc.cpyaddrincde = p_cpyaddr.cpyaddrincde AND p_cpyaddr.cpyincde = '1000' AND civ.CODCOL = SUBSTR(p_ctc.CtcExCde,1,5) AND To_Char(civ.CODAGT) = SUBSTR(p_ctc.CtcExCde,7,5) AND p_ctc.CtcExCde NOT LIKE '99999%' AND p_ctc.dpmtincde = r_dpmt.dpmtincde; 
 
  |  
 
   Cette requête me renvoie bien plus de 5000 enregistrements dont voici une poignée :
  
  Code :
 - CODCOL ENTORG         CTCEXCDE    DPMTINCDE DPMTEXCDE      DPMTINCDE
 - 59350  02070205       59350-27811      1619 097                 1619
 - 59350  02080015       59350-27818      1167 01060102            1167
 - 59350  02080103       59350-27782      1007 0104030206          1007
 - 59350  02070501       59350-27747      1069 0105000210          1069
 - 59350  02061100       59350-27796       987 0104020203           987
 - 59350  02080303       59350-27799      1020 010404              1020
 - 59350  02070000       59350-27750      1460 0700                1460
 - 59350  02070404       59350-27756      1187 010700030104        1187
 - 59350  02050105       59350-9           940 0104000106           940
 
  |  
 
   Ici on se rend bien compte que la colone dpmtincde (code du service) n'est pas à jour car la colonne DPMTEXCDE doit ressembler à la colonne ENTORG à peu de chose car la colonne DPMTEXCDE mixe CODCOL + ENTORG ce qui doit donner pour la première ligne par exemple :
  
  Code :
 - CODCOL ENTORG         CTCEXCDE    DPMTINCDE DPMTEXCDE      DPMTINCDE
 - 59350  02070205       59350-27811      2746   350-02070205      2746
 
  |  
 
   Voici mon Pl/Sql au complet :
  Code :
 DECLARE /* pour mémoriser occurrence lue */      lu_codcol VARCHAR2(5);     lu_entorg VARCHAR2(18);     lu_ctcexcde VARCHAR2(17);     lu_ctcdpmtincde NUMBER(10);     lu_dpmtexcde VARCHAR2(17);     lu_dpmtincde NUMBER(10); /* pour mémoriser la recherche du code interne organigramme */     search NUMBER(10); /* definition du curseur */          CURSOR c1 IS        SELECT civ.codcol, civ.entorg, p_ctc.ctcexcde, p_ctc.dpmtincde, r_dpmt.dpmtexcde, r_dpmt.dpmtincde       FROM p_ctc, p_cpyaddr, jpb_pers civ, r_dpmt       WHERE p_ctc.cpyaddrincde = p_cpyaddr.cpyaddrincde       AND p_cpyaddr.cpyincde = '1000'       AND civ.CODCOL = SUBSTR(p_ctc.CtcExCde,1,5)       AND To_Char(civ.CODAGT) = SUBSTR(p_ctc.CtcExCde,7,5)       AND p_ctc.CtcExCde NOT LIKE '99999%'       AND p_ctc.dpmtincde = r_dpmt.dpmtincde;  BEGIN     Open c1;       LOOP         FETCH c1 INTO lu_codcol, lu_entorg, lu_ctcexcde, lu_ctcdpmtincde, lu_dpmtexcde, lu_dpmtincde;           IF lu_dpmtexcde <> SubStr(lu_codcol,3,3)||'-'||lu_entorg THEN             SELECT r_dpmt.dpmtincde INTO search FROM r_dpmt WHERE r_dpmt.dpmtexcde = SubStr(lu_codcol,3,3)||'-'||lu_entorg;             UPDATE p_ctc SET p_ctc.dpmtincde = search WHERE p_ctc.ctcexcde = lu_ctcexcde;           END IF;         EXIT WHEN c1%NOTFOUND;       END LOOP;     CLOSE c1; END; 
 
  |  
 
   A l'exécution de mon Pl/Sql j'ai une erreur :  
  Code :
 - Line Pos Text
 - 7    1   ORA-01403: Aucune donnée trouvée
 - ORA-06512: à ligne 26
 -          Total execution time 0.266 sec.
 
  |  
 
   J'ai cherché un peu, il faut traiter l'exception, c'est à cause du select into, mais je ne sais pas comment la traiter. Merci pour votre aide.    Message édité par MaRTy59 le 09-08-2010 à 13:39:46
  |