Generador de Cif en plsql. v1.0

Recientemente me he encontrado en la necesidad de generar miles de cif de manera aleatoria, pero que fueran válidos.

Navegando por internet encontré la explicación del cálculo que se realiza para la generación de cif en esta web https://definanzas.com/cif-o-el-codigo-de-identificacion-fiscal-calcular-y-comprobar-diferencias-con-el-nif/#Letra_o_numero_de_control_Letra_C así que decidí hacerme un pequeño plsql para generar cif.

Esta es la versión 1.0 de dicho programa, se podría mejorar y completar. Actualmente este código genera un número de cif, compuesto por un codigo de provincia fijo, al cual se le añade de manera aleatoria una cadena de 5 números y a partir de la cual se calcula el digito de control.

Al número resultante, habría que añadirle una de las letras a elegir entre A,B,E o H.

Para entender el código, recomiendo leer antes el enlace indicado anteriormente.


-- Calculo de cif aleatorios
SET serveroutput ON;
declare
codigoprovincia varchar2(12) := '';
listadoletras varchar2(50) := '';
letra varchar2(10) := '';
digitocontrol integer := 0;
numerointermedio integer := 0;
ciffinal varchar2(20) := '';
controlpares integer := 0;
controlimpares integer := 0;
auximpares integer := 0;

begin
codigoprovincia := '57';

select (dbms_random.value(10000,99999)) into numerointermedio from dual;
numerointermedio := to_number(codigoprovincia || numerointermedio);
dbms_output.put_line('NUMERO: ' || numerointermedio);
controlpares := to_number(substr(numerointermedio,2,1)) + to_number(substr(numerointermedio,4,1)) + to_number(substr(numerointermedio,6,1));
dbms_output.put_line('SUMATORIO PARES: ' || controlpares);

auximpares := to_number(substr(numerointermedio,1,1)) * 2 ;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,3,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,5,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,7,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

dbms_output.put_line('SUMATORIO IMPARES: ' || controlimpares);

dbms_output.put_line('sumatorio controlpares + controlimpares: ' || (controlpares + controlimpares));
dbms_output.put_line('ultimo digito del sumatorio: ' || to_number(substr((controlpares + controlimpares),2,1)));
digitocontrol := 10 - to_number(substr((controlpares + controlimpares),2,1));
dbms_output.put_line('DIGITO CONTROL: ' || digitocontrol);
ciffinal := letra ||numerointermedio || digitocontrol;
dbms_output.put_line(ciffinal);
end;

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *