Problema con codigo PLSQL

Hola,
A ver si alguien me puede ayudar con este codigo, con el que estoy recibiendo un error ORA-01403 no data found, el cual creía tener controlado...

Resumiendo lo que hace, a partir de un cursor, consulto si el CIF esta en otra tabla, y si no está inserto registro, y si está actualizo un campo.
Si el cif aparece 2 veces en el cursor, en la tabla actualizará otro campo:

declare

    cursor cur1 is select pais, cdtercero, dstercero, cddnicif, cdcodabr, cdcuent from tabla1;
   
    v_nif varchar2(25);                                           
    v_proveedor varchar2(10);                   
    v_acreedor varchar2(10);     

BEGIN

   for c1 in cur1 loop   
   
            BEGIN                                                                   
                   
                    SELECT nif_code into v_nif from tabla2 where nif_code = c1.cddnicif;
                   
            EXCEPTION
                    when no_data_found then
                        dbms_output.put_line('No hay datos para ' || c1.cddnicif);
                        v_nif := NULL;                               
                   
            END;
       
            IF v_nif = null then       
           
                       INSERT INTO tabla2 values (c1.cddnicif, null, c1.dstercero, null, c1.cdtercero, null,sysdate, sysdate, null, c1.pais, null);                                                                                                                                         
                       
            ELSE     
                     
                      select proveedor_number, acreedor_number into v_proveedor, v_acreedor from tabla2 where nif_code = c1.cddnicif; 
                     
                      IF v_proveedor = c1.cdtercero and v_acreedor is null then
                     
                            UPDATE tabla2 set acreedor_number = c1.cdtercero where nif_code = c1.cddnicif;
                                                           
                        ELSE
                           
                            UPDATE tabla2 set proveedor_number = c1.cdtercero where nif_code = c1.cddnicif;
                       
                      END IF;
                                             
                                                     
            END IF;
           
            v_nif := null;
            v_proveedor := null;
            v_acreedor := null;
   
   end loop;     
 
   EXCEPTION
   when others then
   dbms_output.put_line('error en ' || sqlerrm);

   COMMIT;   
   
END;


Y cuando lo ejecuto recibo el famoso error:
error en ORA-01403: No se ha encontrado ningún dato 
select proveedor_number, acreedor_number into v_proveedor, v_acreedor from tabla2 where nif_code = c1.cddnicif;

Creo que esta select no la tienes controlada.
Alberich escribió:select proveedor_number, acreedor_number into v_proveedor, v_acreedor from tabla2 where nif_code = c1.cddnicif;

Creo que esta select no la tienes controlada.



Pero esa select solo la ejecuta si encuentra el CIF en tabla2, porque está dentro del ELSE del if.

Y en el primer registro de la tabla1, ya recibo ese error de no_data_found, cuando debería insertarlo en tabla2 porque no existe.
A ver, la select está mal. Y el planteamiento creo que deberías revisarlo. Intenta funcionar a partir de números enteros, quiero decir, no compares resultados de variables sino resultados de consulta, es decir, el número de filas que te devuelve cada select.

Por ejemplo si lo que quieres es averiguar si existe determinado cif:

declare

recuento number(10);
y el resto de variables, claro.
BEGIN

select * from tabla1 into recuento where cif = c.cif (por ejemplo)

if recuento = 0 then

y haces lo que quieras

el if recuento = 1 then

update table2 set campo = valorcampo where cif = c.cif

end if

end;

Hace mucho que no toco plsql pero vamos, yo solía proceder así y no me iba nada mal.
3 respuestas