El código con la función to_number() es correcto, en este caso, el error ORA-06502 puede ser por:
1. El valor de lcampo contiene caracteres no numéricos.
Código:
declare
i number(8);
begin
i := to_number( '123.4a' , '999.99' );
end;
2. La longitud de la máscara es inferior al valor de lcampo.
Código:
declare
i number(8);
begin
i := to_number( '123.45' , '99.99' );
end;
3. La precisión de la variable es inferior al valor de lcampo.
Código:
declare
i number(1);
begin
i := to_number( '123.45' , '999.99' );
end;
Saludos