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 SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CODCOL ENTORG         CTCEXCDE    DPMTINCDE DPMTEXCDE      DPMTINCDE
59350  02070205       59350-27811      2746   350-02070205      2746
Voici mon Pl/Sql au complet :
Code sql : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Line Pos Text
7    1   ORA-01403: Aucune donnée trouvée
ORA-06512: à ligne 26
 
         Total execution time 0.266 sec.
Je ne vois pas d'ou l'erreur peut venir. Merci pour votre aide.