Le 2nd curseur utilise la variable rec, remplie par le résultat du 1er curseur.
Il faut peut-être que tu fasses un OPEN / FETCH du 2ème curseur juste avant de regarder %NOTFOUND.
Et enfin, je comprends pas trrop ta logique ! Quand le code n'est pas trouvé dans type_flux, tu mets à jours TOUS les libellés de type_flux !!!
J'imagine que tu veux mettre à jour le libellé dans type_flux, à code égal, trouvé dans tmp_type_flux.
 
Voici un moyen de le faire, plus simple :
 
Code :
 - DECLARE
 -   numberOfRowsMissing INTEGER;
 - BEGIN
 -   -- Verification de la coherence des donnees entre tmp_type_flux et type_flux
 -   SELECT COUNT(*)
 -   INTO numberOfRowsMissing
 -   FROM tmp_type_flux ttf
 -   WHERE NOT EXISTS (SELECT 1 FROM type_flux tf WHERE tf.code = ttf.code);
 -   IF (numberOfRowsMissing > 0) THEN
 -     RAISE_APPLICATION_ERROR(-20000, 'La table tmp_type_flux contient ' || numberOfRowsMissing  || ' lignes  qui n'existent pas dans type_flux');
 -   END IF;
 -   -- Mise à jour de type_flux
 -   FOR r IN (
 -     SELECT code, libelle
 -     FROM tmp_type_flux
 -   )
 -   LOOP
 -     UPDATE type_flux
 -     SET libelle = r.libelle
 -     WHERE code = r.code;
 -   END LOOP;
 - END;
 
  | 
 
edit : si tu veux plutôt sortir un message d'erreur (dbms_output) par ligne manquant, il faut faire le COUNT dans la boucle plutôt, voire faire l'UPDATE et récupérer le nombre de lignes affectées (il me semble qu'on peut récupérer l'info).