[firebase-br] SP para Guid que dá problemas em alguns versões de FB 2.1

Sandro Souza escovadordebits em gmail.com
Qui Set 3 16:13:24 -03 2009


Bom dia/tarde Evandro.

Grande Evandro, só como sugestão, remova os dois-pontos que estão antes do
nome do parâmetro HEX e da variável local I.

Também notei que se for passado, por parâmetro, uma string contendo um
número ímpar de nibbles (dígitos hexadecimais), vai gerar uma exceção quando
vai acessar o segundo nibble que forma o código ASCII do próximo caracter a
ser acrescentado na variável local TEMP.

Tente modificar a condição do WHILE de:

WHILE (I <= CHAR_LENGTH(:HEX)) DO

para:

WHILE (I <= (CHAR_LENGTH(HEX) - 1)) DO

Dessa forma, se for informada uma string com tamanho ímpar, o último
caracter dela será ignorado.

Você poderia também verificar logo se o tamanho do parâmetro HEX é ímpar,
disparando uma exceção se for o caso.

De qualquer forma, são apenas sugestões.

Espero ter ajudado mais que atrapalhado. :D

2009/9/3 Evandro's mailing lists (Please, don't send personal messages to
this address) <listasjr em gmail.com>

> Pessoal,
>
> Gostaria de uma ajuda com essa query que em alguns bancos FB está dando
> erro
> na compilação (Na minha compila ok 2.1.2.18118). Entretanto roda ok se
> mandar executar como script. Vocês acham que tem algum erro na SP ou é só
> algum bug do firebird? Nas atualizações de banco é a maior confusão pois
> temos que sair comentando ela no metadados antes de atualizar, o que
> consome
> uma boa parcela de tempo do suporte. Qualquer ajuda será válida.
>
> Muito obrigado
> -Evandro
>
>
>
> CREATE PROCEDURE SP_HEX2UUID (
>
>    hex varchar(32))
>
> returns (
>
>    result char(16) character set octets)
>
> as
>
> declare variable i integer;
>
> declare variable temp varchar(16) character set octets;
>
> begin
>
>  hex = upper(:HEX);
>
>  temp = '';
>
>  i = 1;
>
>  while (i <= char_length(:HEX)) do
>
>  begin
>
>     temp = :TEMP || ascii_char((position(substring(:hex from :i for 1),
>
>            '0123456789ABCDEF') - 1) * 16 + (position(substring(:hex from :i
> + 1 for 1), '0123456789ABCDEF') - 1));
>
>     i = (:i + 2);
>
>  end
>
>  result = temp;
>
>  suspend;
>
> end
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista