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
|