Categorias

Validação de Titulo de Eleitor

Com este função, escrita em PL/SQL, é possível validar o dígito verificador do título de eleitor brasileiro.

PL/SQL para quem não conhece é a linguagem que roda dentro do banco de dados Oracle.

Para utilizar a função, basta passar por parâmetro o número do título de eleitor, a função retornará True caso o título seja válido e False para um título inválido.

FUNCTION valida_titulo (In_tit_eleitor IN VARCHAR2)  RETURN BOOLEAN IS
        TYPE Titulo_invalido IS TABLE OF VARCHAR2 (12);

        T_titulo_invalido   Titulo_invalido := Titulo_invalido ('000000000000');
        I                   BINARY_INTEGER  := 0;
        J                   BINARY_INTEGER  := 0;
        Digito1             NUMBER          := 0;
        Digito2             NUMBER          := 0;
        Decr1               NUMBER          := 9;
    BEGIN
        IF LENGTH (In_tit_eleitor) = 12 THEN
            --
            FOR I IN 1 .. 8 LOOP
                Digito1 := (Digito1 + to_number (substr (In_tit_eleitor, I, 1) ) * Decr1);
                Decr1  := (Decr1 - 1);
            END LOOP;

            --
            Digito1 := MOD (Digito1, 11);

            --
            IF Digito1 IN (0, 1) THEN
                IF (    to_number (substr (In_tit_eleitor, 9, 1) ) = 0
                    AND (   to_number (substr (In_tit_eleitor, 10, 1) ) = 1
                         OR to_number (substr (In_tit_eleitor, 10, 1) ) = 2) ) THEN
                    IF (Digito1 = 0) THEN
                        Digito1 := 1;
                    ELSE
                        Digito1 := 0;
                    END IF;
                ELSE
                    Digito1 := 0;
                END IF;
            ELSE
                Digito1 := (11 - Digito1);
            END IF;

            --
            IF Digito1 = to_number (substr (In_tit_eleitor, 11, 1) ) THEN
                J      := 1;
            ELSE
                J      := 0;
            END IF;

            --
            IF J = 1 THEN
                Digito2 :=
                     (to_number (substr (In_tit_eleitor, 9, 1) ) * 4) + (to_number (substr (In_tit_eleitor, 10, 1) ) * 3)
                     + (Digito1 * 2);
                Digito2 := MOD (Digito2, 11);

                --
                IF (    (Digito2 = 0)
                    OR (Digito2 = 1) ) THEN
                    IF (    to_number (substr (In_tit_eleitor, 9, 1) ) = 0
                        AND (   to_number (substr (In_tit_eleitor, 10, 1) ) = 1
                             OR to_number (substr (In_tit_eleitor, 10, 1) ) = 2) ) THEN
                        IF Digito2 = 0 THEN
                            Digito2 := 1;
                        ELSE
                            Digito2 := 0;
                        END IF;
                    ELSE
                        Digito2 := 0;
                    END IF;
                ELSE
                    Digito2 := (11 - Digito2);
                END IF;

                --
                IF Digito2 <> to_number (substr (In_tit_eleitor, 12, 1) ) THEN
                    J      := 0;
                ELSE
                    J      := 1;
                END IF;
            --
            END IF;
        END IF;

        --
        IF J = 1 THEN
            IF In_tit_eleitor = T_titulo_invalido (1) THEN
                RETURN (FALSE);
            ELSE
                RETURN (TRUE);
            END IF;
        ELSE
            RETURN (FALSE);
        END IF;
    --
    EXCEPTION
        WHEN OTHERS THEN
            RETURN (FALSE);
    END;