Você está na página 1de 5

Validao de Ttulo de Eleitor

Com esta funo, escrita em PL/SQL, possvel validar o dgito verificador do ttulo de eleitor
brasileiro.
Para utilizar a funo, basta passar por parmetro o nmero do ttulo de eleitor, a funo
retornar True caso o ttulo seja vlido e False para um ttulo invlido.
1 FUNCTION valida_titulo (In_tit_eleitor IN VARCHAR2) RETURN BOOLEAN IS
2
TYPE Titulo_invalido IS TABLE OF VARCHAR2 (12);
3
4
T_titulo_invalido Titulo_invalido := Titulo_invalido ('000000000000');
5
I
BINARY_INTEGER := 0;
6
J
BINARY_INTEGER := 0;
7
Digito1
NUMBER
:= 0;
8
Digito2
NUMBER
:= 0;
9
Decr1
NUMBER
:= 9;
10
BEGIN
11
IF LENGTH (In_tit_eleitor) = 12 THEN
12
-13
FOR I IN 1 .. 8 LOOP
14
Digito1 := (Digito1 + to_number (substr (In_tit_eleitor, I, 1) ) * Decr1);
15
Decr1 := (Decr1 - 1);
16
END LOOP;
17
18
-19
Digito1 := MOD (Digito1, 11);
20
21
-22
IF Digito1 IN (0, 1) THEN
23
IF ( to_number (substr (In_tit_eleitor, 9, 1) ) = 0
24
AND ( to_number (substr (In_tit_eleitor, 10, 1) ) = 1
25
OR to_number (substr (In_tit_eleitor, 10, 1) ) = 2) ) THEN
26
IF (Digito1 = 0) THEN
27
Digito1 := 1;
28
ELSE
29
Digito1 := 0;
30
END IF;
31
ELSE
32
Digito1 := 0;
33
END IF;
34
ELSE
35
Digito1 := (11 - Digito1);
36
END IF;
37
38
-39
IF Digito1 = to_number (substr (In_tit_eleitor, 11, 1) ) THEN
40
J
:= 1;
41
ELSE
42
J
:= 0;
43
END IF;
44
45
-46
IF J = 1 THEN
47
Digito2 :=
48
(to_number (substr (In_tit_eleitor, 9, 1) ) * 4) + (to_number (substr
(In_tit_eleitor, 10, 1) ) * 3)
49
+ (Digito1 * 2);
50
Digito2 := MOD (Digito2, 11);
51
52
-53
IF ( (Digito2 = 0)
54
OR (Digito2 = 1) ) THEN
55
IF ( to_number (substr (In_tit_eleitor, 9, 1) ) = 0

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

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;

Funo para obter a data da pscoa


O dia da Pscoa o primeiro domingo depois da Lua Cheia que ocorre no dia ou depois de 21
maro. Entretanto, a data da Lua Cheia no a real, mas a definida nas Tabelas Eclesisticas.
A Quarta-Feira de Cinzas ocorre 46 dias antes da Pscoa, e, portanto, a Tera-Feira de
carnaval ocorre 47 dias antes da Pscoa. O dia de Corpus Christi ocorre 60 dias aps a
Pscoa.Esta funo tem por objetivo, a partir do ano informado, obter a data da pscoa
daquele ano. util para prever os feridos mveis do ano, que so todos em funo da data da
Pscoa, conforme descrito acima.

1 FUNCTION data_pascoa (In_ano NUMBER) RETURN DATE IS


2
3 /**************************************
4
5
Para calcular a data da Pscoa para qualquer ano no calendrio Gregoriano
6
(o calendrio civil no Brasil), usa-se a seguinte frmula, com TODAS AS
7
VARIVEIS INTEIRAS, com os resduos das divises ignorados.
8
Usa-se A para ano, M para ms, e D para dia.
9
c = a/100
10
n = a - 19*(a/19)
11
k = (c - 17)/25
12
i = c - c/4 - (c-k)/3 +19*n + 15
13
i = i - 30*(i/30)
14
i = i - (i/28)*(1-(1/28)*(29/(i+1))*((21-n)/11))
15
j = a + a/4 + i + 2 -c + c/4
16
j = j - 7*(j/7)
17
l=i-j
18
m = 3 + (l+40)/44
19
d = l + 28 - 31*(m/4)
20
21
Este algoritmo de J.-M.Oudin (1940) e impresso no
22
Explanatory Supplement to the Astronomical Almanac, ed. P.K. Seidelmann (1992).
23
24
Retirado originalmente de
25
http://www.if.ufrgs.br/~kepler/fis207/pascoa.html
26
e adaptado para PL/SQL por Ricardo Falter
27
28
********************************************************************************/
29
30
31
A INTEGER := In_ano; -- unico parametro, o ano a se obter a data da pascoa
32
M INTEGER; -- variavel para o mes
33
D INTEGER; -- variavel para o dia
34
C INTEGER; -- variavel para o seculo
35
I INTEGER; -- variavel auxiliar
36
J INTEGER; -- variavel auxiliar
37
K INTEGER; -- variavel auxiliar
38
L INTEGER; -- variavel auxiliar
39
N INTEGER; -- variavel auxiliar
40
BEGIN
41
C
:= trunc (A / 100);
42
N
:= A - 19 * (trunc (A / 19) );
43
K
:= trunc ( (C - 17) / 25);
44
I
:= C - trunc (C / 4) - trunc ( (C - K) / 3) + 19 * N + 15;
45
I
:= I - 30 * (trunc (I / 30) );
46
I
:= I - (trunc (I / 28) ) * (1 - (trunc (1 / 28) ) * (trunc (29 / (I + 1) ) ) * (trunc ( (21 - N)
/ 11) ) );
47
J
:= A + trunc (A / 4) + I + 2 - C + trunc (C / 4);

48
49
50
51
52
53

J
:= J - 7 * (trunc (J / 7) );
L
:= I - J;
M
:= 3 + trunc ( (L + 40) / 44);
D
:= L + 28 - 31 * (trunc (M / 4) );
RETURN (TO_DATE (lpad (D, 2, 0) || lpad (M, 2, 0) || lpad (A, 4, 0), 'DDMMYYYY') );
END;

Utilizando Cursor com PL/SQL


Com esse cdigo possvel manipular um cursor utilizando PL/SQL.
Neste exemplo utilizamos uma tabela chamada TB_PRODUTOS, realizamos um looping em
cada registro da tabela e cada registro alocado na varivel REG_PRODUTO, para acessar o
valor de algum campo preciso somente utilizar o
formato: NOME_DA_VARIAVEL.NOME_DO_CAMPO.
Por Exemplo:
REG_PRODUTO.PRECO_PRODUTO.
Este apenas um exemplo bsico para ilustrar o funcionamento de um cursor no Oracle
1 DECLARE
2
/* DECLARANDO O CURSOR DE PRODUTOS */
3
CURSOR C_PRODUTOS IS
4
SELECT * FROM TB_PRODUTOS;
5
6
/* DECLARANDO UMA VARIAVEL QUE SERA O REGISTRO DA TABELA */
7
REG_PRODUTO C_PRODUTOS%ROWTYPE;
8
9 BEGIN
10
/* ABRE CURSOR */
11
OPEN C_PRODUTOS
12
13
LOOP
14
/* L UM REGISTRO DO CURSOR */
15
FETCH C_PRODUTOS INTO REG_PRODUTO;
16
17
/* ABANDONA O LOOP CASO SEJA O FINAL DO CURSOR */
18
EXIT WHEN C_PRODUTOS%NOTFOUND;
19
20
/*
21
AQUI SERA INSERIDO O CODIGO QUE IRA MANIPULAR OS DADOS COMO:
22
- INSERIR EM OUTRA TABELA,
23
- FAZER ALGUM CALCULO,
24
- ETC.
25
*/
26
27
END LOOP;
28
29
/* FECHA O CURSOR */
30
CLOSE C_PRODUTOS
31 END;

Você também pode gostar