1 CREATE OR REPLACE PROCEDURE PR_CEDULA(cedula in varchar2) 2 IS 3 longitud numeric; 4 numeroVerificador numeric; 5 digito numeric; 6 pPar numeric; 7 pImpar numeric; 8 sumaPar numeric; 9 sumaImpar numeric; 10 digitoVerificador numeric; 11 BEGIN 12 longitud := LENGTH(cedula);--Longitud del numero digitado 13 sumaImpar:=0; 14 sumaPar:=0; 15 digitoVerificador:=0; 16 --si el número digitado es igual a once(11) inicia la verificación 17 IF longitud = 11 THEN 18 FOR I IN REVERSE 1..longitud LOOP--Bucle que recorre las 11 posiciones 19 --si la posición del numero es 11 obtenemos el ultimo dígito. 20 IF i = 11 THEN 21 numeroVerificador:=to_number(substr(cedula,i,1)); 22 ELSE 23 /*De otro modo obtengo cada dígito del número*/ 24 digito:=to_number(substr(cedula,i,1)); 25 IF MOD(I,2)=0 THEN --Verificó que el dígito sea par 26 pPar := digito * 2;--y multiplico por 2 27 IF pPar >= 10 THEN--sí el resultado es mayor o igual a 10 28 pPar:=pPar-9;--resto nueve del número obtenido 29 END IF; 30 --acumulo el valor de todas las posiciones par en una variable 31 sumaPar:=sumaPar+pPar; 32 ELSE 33 --obtengo y acumulo el valor de la posición impar del número 34 sumaImpar:=sumaImpar + (digito*1); 35 END IF; 36 END IF; 37 END LOOP; --finaliza el bucle for 38 /*obtenemos el dígito verficador restándole a 10 el módulo 10 de la 39 * suma acumulada de los dígito del número 40 */ 41 digitoVerificador:=(10-MOD(sumaPar+sumaImpar,10)); 42 /*comparamos que el digito verificador y el numeroverificador sean 43 iguales o que el digito verificador sea igual a 10 y el 44 numero verificador igual a cero. 45 */ 46 IF (digitoVerificador = numeroVerificador) OR 47 ((digitoVerificador=10) AND (numeroVerificador=0)) THEN 48 dbms_output.put_line('Cédula Valida'); 49 ELSE 50 dbms_output.put_line('Número de Cédula Incorrecto '); 51 END IF; 52 ELSE 53 dbms_output.put_line('Cédula incompleta'); 54 END IF; 55 --CONTROL DE ERRORES-- 56 EXCEPTION 57 WHEN OTHERS THEN 58 DBMS_OUTPUT.put_line('ERROR: '||SQLCODE||' '||'DESCRIPCION '||SQLERRM); 59 END; 60 61 --Para correr el procedimiento ponemos los siguiente--
62 BEGIN 63 PR_CEDULA('00100000000'); 64 END;
Espero que les sea útil.
No hay comentarios:
Publicar un comentario