22 de marzo de 2013

Procedimiento en Oracle para Validar Cédula Dominicana

Como lo prometido es deuda, aquí les dejo el procedimiento en Oracle que permite validar una cédula dominicana. Anteriormente publique un post que mediante un método en C# valida dicho documento.



 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