Bonjour,

Dans un traitement PL/SQL qui passe tous les jours chez un client depuis des mois, j'utilise un bulk collect dans un curseur.

Le curseur est déclaré comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
cursor c_ldec  (deccod mdecs.dec_cod%type, tcmu mdecs.dec_tcmu%type) is
    select  ldec_dpa_initial,
              format_ps_corse(ldec_nexec) as ldec_nexec,
              ldec_nexec as ldec_nexec_orig,
              ldec_spe_clas, 
    from    mldecs, macts
    where   ldec_dec_cod = deccod;
 
type tab_ligne_dec is table of c_ldec%rowtype;
pck_tab_ligne_dec tab_ligne_dec := tab_ligne_dec();
Ce curseur est exploité comme ceci :

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
 
  open c_ldec(r_dec.t303_dec_cod, r_gen.dec_tcmu);
  fetch c_ldec bulk collect into pck_tab_ligne_dec;
  close c_ldec;
 
  if pck_tab_ligne_dec.count > 0 then
     for i in pck_tab_ligne_dec.first..pck_tab_ligne_dec.last
     loop
         if pck_tab_ligne_dec.exists(i) then
             ...
             if pck_tab_ligne_dec(i).LDEC_NEXEC is not null then
                   ...
             else
                   -- PASSE ICI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             end if;
 
         end if;
     end loop;
  end if;
Tous les jours, ce curseur lit des milliers d'enregistrements, tout marche bien...sauf pour très très peu d'enregistrement pour lequel il passe dans le ELSE du IF ci-dessus alors que la zone LDEC_NEXEC n'est jamais nulle.

Je précise que la fonction format_ps_corse() appelée dans le SELECT marche très bien (jamais d'erreur) et ne renvoie jamais null (vérifié via les traces de mon traitement).

Quelqu'un aurait-il une idée ?
Un quelconque problème sur le BULK COLLECT est-il connu ? (je ne trouve rien sur le support d'Oracle).

Merci d'avance pour vos réponses.