Вы находитесь на странице: 1из 15

Laboratrio de Banco de Dados II Stored Procedures Parte 2

I Stored procedure
Na aula de hoje, vamos codificar uma procedure com o objetivo de familiariz-los com as estruturas que podem ser utilizadas. Para isto, vamos considerar a explicao seguinte sobre o termo CRC. O exemplo de procedure apresentado abaixo no a melhor forma de resolver o problema apresentado, mas uma tima oportunidade para conhecer alguns recursos oferecidos por um SGBD. II CRC (Cyclic redundacy check / Cyclic redundacy code / Byte de paridade) dgito verificador. Em vrias situaes utilizam-se caracteres de controle para verificar se uma determinada sequncia est correta. So utilizados para garantir a integridade de dados na transmisso atravs das redes de computadores, na gravao em disco, como tambm na digitao. Existem utilizaes semelhantes para validao de dados, com no dgito verificador de conta corrente, nmero do ttulo de eleitor, etc. Especificamente falando sobre dgitos verificadores, existem os chamados dgito verificador mdulo 11, ou mdulo 10 que significam o seguinte: d = g( f(s) % 11) d = g( f(s) % 10) onde s a cadeia de caracteres sobre a qual o dgito de controle ser calculado f uma funo calculada sobre a cadeia g uma segunda funo aplicada sobre o resultado da operao mdulo sobre o resultado de f. Eventualmente, a funo g o prprio resultado da operao mdulo de f pelo valor escolhido (10 ou 11). d o dgito verificador para a sequncia. para o mdulo 11 e para o mdulo 10

As funes f e g so as mais variadas possveis e dependem de objetivos especficos ou do responsvel pelo projeto. Voc encontrar as mais variadas funes, algumas delas no muito boas, embora muito utilizadas. O exemplo que vamos tratar a seguir indicado para ser resolvido numa linguagem de programao, mas vamos tratar numa stored procedure para que voc tenha a oportunidade de ver como isto pode ser feito.

III Cadeia de caracteres alfanumricos Considere um exemplo de cadeia de caracteres m para a qual desejamos computar o dgito verificador segundo uma funo que passaremos a discutir. m = zWx4 Seja t a correspondente sequncia de caracteres na notao matemtica: ( ) ( ), onde

Seja s a sequncia de valores numricos de modo que cada um de seus elementos seja o ASCII correspondente do elemento da sequncia t, ou seja, ( ) ( ) Ou seja, ( )

IV Cadeia de caracteres com somente numricos (dgitos) De forma anloga ao tipo de cadeia anterior, considere um exemplo de cadeia m com somente algarismos para a qual desejamos computar o dgito verificador, segundo a mesma funo aplicvel cadeia de caracteres alfanumricos. A funo a mesma, o que pode mudar a interpretao dos caracteres. Seja t a correspondente sequncia de caracteres na notao matemtica: m = 9704 t = (9,7,0,4) e seja s a sequncia de valores numricos de modo que cada um de seus elementos seja o valor do correspondente elemento da sequncia t, computado de uma das duas formas abaixo: a) Primeira interpretao Sequncia de caracteres numricos (dgitos como caracteres) A sequncia m considerada uma cadeia de caracteres, mesmo que contenha somente algarismos. O valor do elemento correspondente na sequncia s calculado com o valor do respectivo ASCII, ou seja, no exemplo, ( ( ) ) ( ) ( ) ( )

Ou seja,

Esta interpretao a mesma aplicada cadeia de caracteres alfanumricos, ainda que a cadeia possua somente dgitos.

b) Segunda interpretao Sequncia de dgitos A sequncia m considerada uma cadeia de algarismos (dgitos) de 0 a 9 e o valor do elemento correspondente na sequncia s o valor do prprio algarismo. Neste caso, obrigatoriamente, a sequncia deve conter somente algarismos. Veja o seguinte exemplo: m = 9704 ( ( A expresso ( ) ( ) ) ) ( )

( )

necessria porque t uma sequncia de caracteres. Ou seja, ( )

V Entendimento das diferentes interpretaes Para entender a diferena das interpretaes, considere o nmero m = 57 em diferentes formatos binrios para cada uma das interpretaes citadas:

a) Interpretao IV-a (como uma sequncia de caracteres). Neste caso, t = (5,7) e s = (53,55). Para encontrar os valores ASCII correspondentes, siga o seguinte exemplo:
select ascii('5') from dual select ascii('7') from dual

0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1

b) Interpretao IV-b (como uma sequncia de algarismos). Neste caso, t = (5,7) e s = (5,7).

0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1

c) Como um nmero inteiro. Considere a cadeia "57" como uma sequncia de um nico elemento com o valor 57 em decimal. Neste caso,

t = (57) e s = (57).

0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1

VI Detalhamento da funo Continuando com a funo que utilizaremos, ao contrrio do que voc est acostumado, vamos designar os ndices da sequncia de 1..n e no de 0..n-1. Seja, ento, a funo f(s), calculada da seguinte forma para s=(s1, s2, ...,sn): f(s) = si (n i + 2), i = 1,..,n Ateno: n a quantidade de elementos da sequncia e, tambm, o ndice do ltimo elemento da sequncia, pela escolha que fizemos para a notao.
seja resto = f(s) % 11 se resto = 0 ou 1, digito_verificador = 0 caso contrrio, digito_verificador = 11 resto

ou de outra forma:
seja diff = 11 ( f(s) % 11 ) se diff = 10 ou 11, digito_verificador = 0 caso contrrio, digito_verificador = diff.

Para melhor entendimento, vamos analisar um exemplo considerando uma sequncia de apenas nove elementos, embora a quantidade que permitiremos seja de at 200.

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2)

1 t1 s1 10 10 s1

2 t2 s2 9 9 s2

3 t3 s3 8 8 s3

4 t4 s4 7 7 s4

5 t5 s5 6 6 s5

6 t6 s6 5 5 s6

7 t7 s7 4 4 s7

8 t8 s8 3 3 s8

9 t9 s9 2 2 s9

Com o resultado obtido pelo esquema acima, calculam-se o somatrio e o mdulo e se obtm o dgito verificador. O processo calcula o dgito verificador em dois passos. Primeiramente, calcula com o algoritmo acima para o nmero apresentado. Depois, acrescenta o dgito calculado no final da sequncia original, obtendo-se uma nova cadeia para a qual o dgito novamente recalculado. O dgito final uma sequncia de dois algarismos composto pelo resultado dos dois clculos.

VII Exemplos de clculo Vamos a um exemplo prtico, utilizando o mtodo acima com n=9 para trs situaes: a) Uma sequncia alfanumrica. Neste caso, a nica interpretao vlida como uma sequncia de caracteres: Seja m = 'LBD2sp913' ( ( Deste modo, temos ( Vamos seguir pelas figuras: ) ) ) ( ( ) )

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador1

1 L 76 10 760

2 B 66 9 594

3 D 68 8

4 2 50 7

5 s 115 6 690

6 p 112 5

7 9 57 4

8 1 49 3

9 3 51 2 3975 4 7

544 350

560 228 147 102

A primeira parte do dgito 7. Agora, vamos acrescent-la sequncia inicial e recalcular o dgito. Portanto, agora n = 10 e a sequncia 'LBD2sp9137'.

Obs.: no h a necessidade de acrescentar o resultado na cadeia original ou na sequncia t, mas somente na sequncia s.

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador2

1 L 76 11 836

2 B 66 10 660

3 D 68 9

4 2 50 8

5 s 115 7 805

6 p 112 6

7 9 57 5

8 1 49 4

9 3 51 3

10 7 55 2 110 4729 10 1

612 400

672 285 196 153

Assim, a primeira parte do dgito vale 7 e a segunda vale 1. Concatenando os dois algarismos, para este mtodo de clculo, dizemos que o dgito verificador 71.

b) Uma sequncia numrica interpretada como uma sequncia de caracteres.

Calculemos o dgito para a sequncia abaixo

m = 758956243.

Como vimos, temos duas interpretaes possveis para a sequncia. Elas produzem diferentes resultados. Nesta simulao, vamos adotar a primeira delas, ou seja, a que foi apresentada da seguinte forma: ( ( ) ) ( ) ( )

No exemplo,

m = 758956243 ( ( Ou seja, (

) )

) ( )

Vamos examinar com mais detalhes nas seguintes figuras:

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador1

1 7 55 10 550

2 5 53 9 477

3 8 56 8 448

4 9 57 7 399

5 5 53 6 318

6 6 54 5 270

7 2 50 4 200

8 4 52 3 156

9 3 51 2 102 2920 5 6

A primeira parte do dgito 6. Agora, vamos acrescent-la sequncia inicial e recalcular o dgito. Portanto, agora n = 10 e a nova cadeia 7589562436.

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador2

1 7 55 11 605

2 5 53 10 530

3 8 56 9 504

4 9 57 8 456

5 5 53 7 371

6 6 54 6 324

7 2 50 5 250

8 4 52 4 208

9 3 51 3 153

10 6 54 2 108 3509 0 0

Assim, a primeira parte do dgito vale 6 e a segunda vale 0. Concatenando os dois algarismos, para este mtodo de clculo, dizemos que o dgito verificador 60.

c) Uma sequncia numrica interpretada como uma sequncia de dgitos.

Calculemos o dgito para a sequncia

m = 758956243. Como vimos, temos duas interpretaes possveis para a sequncia. Elas produzem diferentes resultados. Nesta simulao, vamos adotar a segunda delas, ou seja, a que foi apresentada da seguinte forma: ( )

No exemplo,

m = 758956243 ( ( A expresso ( ) (

( )

necessria porque t uma sequncia de caracteres. Ou seja, ( )

Vamos examinar com mais detalhes nas seguintes figuras:

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador1

1 7 7 10 70

2 5 5 9 45

3 8 8 8 64

4 9 9 7 63

5 5 5 6 30

6 6 6 5 30

7 2 2 4 8

8 4 4 3 12

9 3 3 2 6 328 9 2

A primeira parte do dgito vale 2. Agora, vamos acrescent-la sequncia inicial e recalcular o dgito. Portanto, agora n = 10 e a nova sequncia 7589562432.

ndice i sequncia ti sequncia de valores si fator = (n i + 2) si (n i + 2) f(s) = si (n i + 2), i = 0,..,n f(s) mod 11 digito_verificador2

1 7 7 11 77

2 5 5 10 50

3 8 8 9 72

4 9 9 8 72

5 5 5 7 35

6 6 6 6 36

7 2 2 5 10

8 4 4 4 16

9 3 3 3 9

10 2 2 2 4 381 7 4

Assim, a primeira parte do dgito vale 2 e a segunda vale 4. Concatenando os dois algarismos, para este mtodo de clculo, dizemos que o dgito verificador 24.

VIII Atividade Em banco de dados possvel fazer muitas coisas, inclusive criar stored procedures, como vocs fizeram na aula anterior. Podem tambm manipular elementos de uma cadeia, utilizando funes que obtm cada um dos seus elementos. Realizar a atividade desta aula em banco de dados no deve ser encarado como o melhor mtodo; seria mais natural utilizar uma linguagem de uso geral. No entanto, para explorar as possibilidades, esta aula ser dedicada a manipular elementos de uma cadeia e calcular o dgito verificador segundo o esquema acima. Eventualmente, vocs podero utilizar a mesma tcnica numa situao em que estratgia seja aplicvel. Observao importante: Neste texto, as variveis so indicadas por nome com o prefixo v_. Sempre que no roteiro, aparecer este prefixo, voc deve substituir pela forma como os identificadores so formados neste ambiente. Esta forma adotada porque as regras de formao de nomes so diferentes nos diversos produtos. No Oracle: DECLARE name VARCHAR2(50); emp_count INT; index INT; length INT; /* Multiple declaration not acceptable i, j, k, l SMALLINT; */ No Microsfot SQL Server: DECLARE @name VARCHAR(50), @emp_count INT, @index INT, @length INT No MySql: a) /* Block scope declaration - In MySQL the local variavel has a begin/end block scope */ DECLARE name VARCHAR(50); DECLARE emp_count, length, index INT; b) Session scope variable Do incio ao fim da conexo

SET @count = 100; 1. Diferena nas representaes binrias de uma cadeia e seu respectivo nmero inteiro.

Como primeiro passo, considere a sequncia formada pelos antepenltimo e penltimo algarismos da sua matrcula. Escreva a representao binria da sequncia dos nmeros considerando as diferentes interpretaes apresentadas neste roteiro em dois bytes de 8 bits. Para melhor entendimento,suponha que a sequncia sejam os nmeros xy. a) Como uma cadeia de caracteres ("x","y"); b) Como uma cadeia de dgitos (x,y); c) Como um nmero inteiro decimal (y + 10 x). Salve os resultados no arquivo de nome seu_registro_academico_binario.txt e o envie ao servidor, substituindo seu_registro_academico pelo seu registro acadmico.

2. Codificao de stored procedure Codificar uma stored procedure de nome pr_computa_digito_verificador que faz o clculo de dgitos verificadores da forma acima. Utilize os comandos vistos na aula anterior para criao de uma stored procedure.

3. Reflexo sobre o tipo do parmetro da procedure no caso de sequncia numrica. Discusso sobre diferentes interpretaes para uma cadeia de algarismos: a) Parmetro como nmero inteiro Se o parmetro for do tipo inteiro ou inteiro de 64 bits, a representao interna para as cadeias 7, 07, 007, 0007 ser a mesma. Se quisermos calcular o dgito para a sequncia 000009999, precisaremos de um segundo parmetro com o nmero de algarismos a considerar para que o nmero inteiro seja completado com zeros esquerda at formar a sequncia desejada. Neste caso, a verificao de tipo numrico no necessria porque a prpria declarao do parmetro invalida um parmetro no numrico. b) Parmetro como sequncia de caracteres Se for uma cadeia de caracteres com smbolos de 0 a 9, no temos o problema dos zeros esquerda, no entanto precisamos validar se no existe smbolo invlido na sequncia. Alm disso, para verificar se o nmero maior que zero, precisaremos transformar a sequncia na representao inteira, lembrando que a sequncia zero pode ser 0, 00, 000,... A procedure da nossa atividade ser utilizada para calcular o dgito independentemente do tipo de caractere, podendo ser um misto de caracteres abrangidos pelo cdigo ASCII. Portanto, o parmetro de

entrada deve ser necessariamente do tipo caractere, no sendo afetada por esta reflexo a respeito de parmetro do tipo inteiro.

4. Parmetros de entrada a) Sequncia de caracteres de at 200 elementos. Utilize o tipo de comprimento varivel (varchar) com 201 caracteres de forma que possa validar a conformidade com a especificao. Ou seja, a forma de verificar se a cadeia extrapolou o limite permitido. b) Indicativo do tipo de representao a ser aplicada. A cadeia de caracteres deve ser tratada como caracteres ou como sequncia de algarismos. (Valores aceitveis do parmetro: C ou N) 5. Declarao de variveis Declare as variveis necessrias. Entre elas: a) b) c) d) ndice corrente da sequncia. Percorre elemento por elemento da sequncia; Fator de multiplicao que se altera a cada passo; Duas variveis para armazenar as duas somatrias, pois sero dois dgitos verificadores parciais; Duas variveis para os dgitos verificadores parciais.

Para variveis que guardaro cadeias de caracteres, utilize o tipo de comprimento varivel (varchar). 6. Verificaes necessrias: Se a forma de interpretao for numrica (um inteiro longo), ou seja, o segundo parmetro vale N, necessrio:

a) Pode conter somente algarismos de 0 a 9. b) Remover brancos esquerda e direita da sequncia. Em qualquer das interpretaes, interrompa a execuo se a sequncia contiver mais de 200 caracteres. Interromper a execuo se o tipo de interpretao (segundo parmetro) no for vlido (C ou N).

7. Verificao de cadeias numricas.

Em geral existem funes que verificam se uma cadeia de caracteres pode ser interpretada como um nmero, por exemplo: isnumeric( 999789.88).

Para o nosso propsito, isto no aplicvel porque consideramos somente sequncia de algarismos e o smbolo ponto no se enquadra neste contexto. Em razo disto, utilize a seguinte construo:

if ( v_variavel like '%[^0-9]%' ) // no numrico para o nosso propsito begin . . . end . . .

claro que seria uma cadeia perfeitamente vlida se a interpretao fosse a de caractere (C), mas no este o caso tratado neste item. 8. Cdigo para remoo de espaos esquerda e direita Somente se o tipo de interpretao for N (numrico), remova os espaos em branco no incio e final da cadeia. Adapte o cdigo com os nomes de suas variveis.

rtrim(ltrim(v_seq_char_original))

9. Como obter a quantidade de caracteres de uma sequncia char_length('980343') /* retorna a quantidade de caracteres exemplo de constante */ char_length(v_numero_char) /* retorna a quantidade de caracteres exemplo com varivel */

10. Como acrescentar sequncia de caracteres a outra cadeia set v_string = v_string || 'abc10' /*A operao de concateno || ( pipe) */

11. Para obter o i-simo elemento da cadeia e do correspondente valor ASCII:

substring(v_sequence_char,v_index,1) /* Obtem o caracter da posio indicada pela varivel v_index */ ascii("Z") /* Cdigo ASCII referente ao caracter Z */ Obs.: Todos os produtos possuem funes para estas finalidades, mas as assinaturas e nomes podem ser diferentes. 12. Clculo do valor do algarismo (Interpertao N) correspondente a um caractere da cadeia.

ascii("9") - ascii("0") /* Valor numrico de um algarismo */

O segundo termo da expresso constante. A primeira corresponde ao caractere da posio atual da cadeia de entrada. Em geral, os sistemas de banco de dados possuem funes de converso que

permitem obter o valor de outra forma, mas no existe especificao padro. Desta forma, o clculo acima mais genrico. 13. Valor do primeiro dgito na obteno da segunda parte do dgito verificador O primeiro dgito calculado deve ser considerado na obteno da segunda parte que, ao final, juntos, comporo o dgito verificador da cadeia de entrada. Se a interpretao for N, o valor obtido para o primeiro dgito o que deve ser considerado na obteno da somatria. Se a interpretao for do tipo C, ento deveremos obter o valor ASCII do caractere correspondente primeira parte do dgito verificador. Calcule da seguinte forma:

v_d1 + ascii("0") /* ASCII do algarismo de valor v_d1. Neste caso, v_d1 a primeira parte do dgito */ Obs.: Utilize as regras corretas na formao de identificadores para a varivel v_d1.

14. Bloco de repetio do algoritmo Existem vrias formas de calcular isto. Em geral, as pessoas fazem este clculo em dois loops, um para o primeiro dgito verificador e outro para o segundo. A diferena nesta atividade que voc dever calcular os dois dgitos com apenas um loop. No pode fazer dois loops, um por dgito verificador. Verifique como voc pode construir as duas somas de uma nica vez e, no final, incluir no segundo total apenas a parte referente ao primeiro dgito verificador que acabou de ser calculado. Codifique a procedure com esta forma de clculo.

15. Apresentao do resultado Ao final, apresente o resultado como uma concatenao da cadeia de entrada, o smbolo - e os algarismos que compem o dgito verificador como cadeias. Ou seja, o resultado final seria a concatenao dos itens abaixo. Nesta operao, todos os elementos devem ser do tipo cadeia de caracteres, ou seja, os valores numricos parciais obtidos no podem participar diretamente desta expresso. Portanto utilize a funo que transforma um algarismo no caractere correspondente, Por exemplo, A funo inversa de ascii('9') = 57 char(57) = '9' No entanto, no clculo do dgito, voc no obtem o valor 57 e sim 9. Existem funes disponveis para fazer esta converso direta, mas vamos optar por uma forma indireta que requer uma reflexo sobre as vrias formas de representao. Desta forma, para obter o caractere correspondente ao valor calculado pode ser obtido da seguinte forma: char(v_digito_obtido + ascii('0'))

/* substitua o nome da varivel para conformar-se com as convenes de designao */ Desta forma, o resultado final seria a concatenao dos seguintes termos: sequncia inicial - /* smbolo hfen */ char(v_digito1 + ascii('0')) /*primeira parte do digito */ char(v_digito2 + ascii('0')) /*segunda parte do digito */

16. Testes de clculo do dgito verificador Faa alguns testes, incluindo os exemplos abaixo:
exec exec exec exec exec exec exec exec exec exec exec exec exec exec exec exec exec exec pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador pr_computa_digito_verificador 'xyzw','C' 'xYzwV','C' 'LBD2sp913','C' 'lbd2SP913','C' '758956243','C' '758956243','N' '4492348','N' '04492348','N' '004492348','N' '00000004492348','C' 'XZ0000W00044KMN92348ABC','C' 'XZ0000W 0004 4KMNac k jl mn 92348ABC','C' 'XzR000w 0004cx KmNac k jl mn wDapG','C' '0000000000','C' '0000000000','N' '4492348','C' '04492348','C' '004492348','C' ---------- ----60 70 71 18 60 24 19 93 84 44 41 43 00 43 12 55

15. Abrangncia e rigor do mtodo Esta funo mais abrangente do que a normalmente utilizada, pois, em geral, ela se restringe a cadeias que possuem poucos elementos, so compostas por algarismos de 0 a 9 e so interpretadas como nmeros. Faa crtica a este mtodo de clculo que utilizado em alguns sistemas. Salve a sua resposta no arquivo de nome seu_registro_academico_digito.txt e o envie ao servidor, substituindo seu_registro_academico pelo seu registro acadmico.

Mos obra!

Prof. Satoshi Nagayama

Вам также может понравиться